1

アプリで第 2 レベルのキャッシュとクエリ キャッシュを有効にしました 次のコードを呼び出すと次のようになります

String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.executeUpdate();

hibernate はすべてのテーブルの UpdateTimestampsCache を更新します。なぜ彼はこれをするのですか?アプリには約 1000 のテーブルと多くの SQL クエリがあります。SQLを介してキャッシュされたテーブルを更新しないため、この更新は必要ありません。これは、巨大なネットワーク トラフィックとアプリケーションの遅延を引き起こします。

SQLクエリを実行するときに更新を行わないようにhibernateに指示する方法はありますか?

4

2 に答える 2

0

通常のセッションの代わりにStatelessSessionを使用してみることができます。hibernateのcreateSQLQueryメソッドの代わりにストレートJDBCを使用することもできます。

もう1つのオプションは、SQLの代わりにHQL更新クエリを使用することです。これにより、更新しているエンティティを特定し、そのクエリのクエリ結果のみを無効にできる可能性があります。SQLクエリを起動すると、Hibernateはどのテーブルが更新されているかを認識しません。したがって、安全を期すために、すべてのクエリキャッシュ結果を無効としてマークします。

于 2011-12-12T16:08:44.813 に答える
0

解決策を見つけました!

addSynchronizedEntityClass() メソッドを使用できます

String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.addSynchronizedEntityClass(SomeTable.class)
query.executeUpdate();

この場合、SOME_TABLE のキャッシュのみをリセットします。

于 2012-02-13T14:39:28.727 に答える