6

1 つのスレッドで複数回呼び出されるクエリがあり、そのスレッド (またはスレッドごとに 1 つのセッションを使用しているため、そのセッション) に対してそのクエリ (およびその結果) をキャッシュしたい場合はどうすればよいですか?私がする ?

注: 私の第 2 レベルのキャッシュはオンになっていますが、主に session.get(...) に使用されます。しかし、クエリキャッシュには使用したくありません。これは、スレッド ( / セッション ) の間だけ存続する必要があるためです。

ありがとう

4

3 に答える 3

5

ここでの要点は、クエリ結果を手動でキャッシュするか、Hibernate にキャッシュするように依頼することができるということです。通常、クエリ キャッシュの有効期間をセッションの有効期間に制限することはほとんど意味がありませんが、次のアプローチを使用して実行できます。

1)クエリ キャッシュを有効にする

2) 問題のクエリ専用の特定の領域を指定し、キャッシュ可能としてマークします。

Query query = ...;
query.setCacheable(true).setCacheRegion("MY_SPECIAL_QUERY");

3)セッションの最後にクエリをキャッシュから削除します(それが本当にやりたいことだと確信している場合):

SessionFactory sessionFactory = ...;
sessionFactory.evictQueries("MY_SPECIAL_QUERY");
于 2009-09-16T15:27:28.923 に答える
2

クエリ キャッシュは、セッション キャッシュには適用できません。一般に、セッションに対するすべての操作は 1 つのコードによって実行され、結果自体を記憶できるはずなので、これは理にかなっています。

あなたは、第 2 レベルのクエリ キャッシュを有効にしたくないと言っていますが、そうすることで何が害になるのでしょうか? あなたはあなたの望む結果を得るでしょう。

于 2009-09-16T13:32:06.830 に答える
0

Hibernate のそのような機能は知りません。

しかし、これは非常に限定された管理可能なコンテキストのようです。私はそれをやろうとしますが、それはコードです。一見すると、さまざまな方法が考えられます。

  • コードがよく知られている場合、複雑さは管理可能です。コード B と C を呼び出すコード A があるとします。どちらもクエリが必要です。結果を B および C に渡すため、クエリを A で 1 回実行できます。B と C に送信するコンテキスト オブジェクトを既に持っているのではないでしょうか? それはシンプルで、エレガントで、意味のある...
  • 反対に、コードがめちゃくちゃで、コンテキストを渡すことができないとします。結果を含む ThreadLocal 変数を持つことができます。現在のスレッド内で設定されていない場合は、それを呼び出して保存します。それ以外の場合は、取得してください。

    2 番目のケースでは、外出時に ThreadLocal をきれいにする必要があることに注意してください。

  • これらの相反するものの間で解決策が可能であり、そのうちの1つはおそらく他のものよりも優れています...

于 2009-09-16T13:26:48.007 に答える