web-dev-qa-db-ja.com

HibernateとEHCache:maxElementsInMemoryはどのように機能しますか?

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>
17
sbrattla

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

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

23
Steve Ebersole