2012-03-29 10 views
2

MySqlでHibernateを使用しています。ローカルサーバーを起動してクエリを渡すときに、返される値が一貫性があり正しいものです。私がupdateQuery経由でデータベースを更新したり、MySqlワークベンチを開いて手動でデータベースを更新したりすると、selectクエリが古い値と時々新しい値を返すことがあります。これは既知の問題ですか?私はbeginTransactionとcommitTransactionがすべてのselect呼び出しの前に、そしてinsert/updateトランザクションの前にもあることを確かめました。面白いのは、再起動後にデータベースに触れるまで、返される値は完璧です。Hibernateの矛盾

+0

あなたはHibernateのようなORMフレームワークを使用している場合ORMフレームワークの外部からのデータベースへのアクセスには、フレームワークが認識している最新の変更が反映されていることが一般的には想定できません。 – aroth

+0

@nwinklerが説明しているように、クエリキャッシュによって発生する可能性があります。休止状態外でデータを変更したり、矛盾する可能性があります。 – rkosegi

+0

まあまあ、私は手動でデータベースを更新すべきではありません。私はここで解決策を試していますし、私の頭に浮かぶアイデアも試しています。何かがうまくいくと、私はここで最も近い答えを受け入れるでしょう –

答えて

2

無効Hibernateのキャッシュ(二次キャッシュクエリキャッシュ)で再度同じことをしてみてください。これを行うには、いずれか、に次のプロパティを設定し、あなたにHibernateやSpring構成で:

  • hibernate.cache.use_query_cache
  • hibernate.cache.use_second_level_cache

これは、Hibernateを起こす必要があります毎回データベースに戻って、結果をデータベースに表示する必要があります。 Hibernateは、セッションの存続期間中(通常は1つのトランザクション)に使用される第1レベルのセッションキャッシュを引き続き使用します。それ以外の場合は、常にデータベースに移動する必要があり、DB内のデータを直接変更しても最新の結果が表示されるはずです。

これが確実に機能することを確認したら、キャッシュを再度有効にして、設計どおりに機能していることを確認できます。 (は読み取り専用を読み書き、...)、キャッシング、特に様々なキャッシング戦略上のクロス読みHibernateのドキュメントに確認してください:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-cache