17

EHCache を defaultCache (要素用)、StandardQueryCache (クエリ用)、および UpdateTimestampsCache (データベースの更新を追跡するためのものと思われるため) で構成しましたが、正確に何をするのかわかりません)。

これらのキャッシュごとに maxElementsInMemory を設定しましたが、取得できないのは、この数値が StandardQueryCache と UpdateTimestampsCache に対して何を制御するかです。デフォルト キャッシュにキャッシュできるエンティティの数は 10000 を超えてはならないことがわかりましたが、クエリ キャッシュは要素をキャッシュしません。主キーをキャッシュします(私が理解している限り)。

これは、StandardQueryCache の maxElementsInMemory が結果からの「行」の数を制御することを意味するのでしょうか、それとも要素の主キー ペアの数を制御するのでしょうか?

UpdateTimestampsCache はどうですか? エンティティが最後に更新された時刻、テーブルが最後に更新された時刻、またはその他の何かを追跡しますか? この maxElementsInMemory には何を使用すればよいですか?

ありがとう!

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect"     dynamicConfig="true">
  <defaultCache 
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="3600">
  </defaultCache>

  <cache
    name="org.hibernate.cache.internal.StandardQueryCache"
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="3600">
  </cache>

  <cache
    name="org.hibernate.cache.spi.UpdateTimestampsCache"
    maxElementsInMemory="10000"
    eternal="true">
  </cache>

</ehcache>
4

1 に答える 1

25

クエリ キャッシュの場合、各クエリ結果の結果は、StandardQueryCache リージョン内の 1 つのエントリになります。したがって、キャッシュは現在、デフォルト/名前のない領域に 10000 の異なるクエリ結果をキャッシュするように設定されています。名前付き領域を使用するように設定されたクエリ (Query#setCacheRegion) は、別のキャッシュ領域に書き込みます。

これらの結果は、基になるデータが変更されるたびに「無効化」する必要があります。それが UpdateTimestampsCache の目的です。Hibernate がテーブルに書き込むとき、UpdateTimestampsCache にエントリを作成します (このプロセスは、これらのキャッシュされたクエリ結果を無効にすることの明示的な一部であるため、クエリ キャッシュが有効になっている場合にのみ有効になります)。キャッシュされたクエリ結果を読み返すとき、クエリ結果と一緒にキャッシュされたタイムスタンプを、使用するすべてのテーブルのタイムスタンプと照合して、結果がまだ有効かどうかを判断します。可能であれば、この地域を制限しないことが最善です。必要に応じて、最適な数は、基になるドメイン モデル内のテーブルの数です。そうしないと、キャッシュされたクエリ結果が不要なときに無効化される可能性があります。ただし、10000 個のテーブルがあるとは想像しにくいので、おそらく問題ありません。

于 2012-09-21T08:06:55.030 に答える