キャッシュの設定

hibernate.cfg.xml ファイルのキャッシュ設定に戻りましょう。

<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

最初の行に注目してください。これには、キャッシュ エンジン クラスの名前が含まれています。Hibernate は実際には内部的にキャッシュを実装しません。代わりに、独自のキャッシュ エンジンを実装できるインターフェイスのセットを提供します。

一般的な実装には次のものがあります。

  • EHCキャッシュ
  • OSキャッシュ
  • SwarmCache
  • JBoss TreeCache

EHCキャッシュ

クラスター キャッシュだけでなく、メモリまたはディスク上にキャッシュすることもでき、オプションで Hibernate クエリ結果のキャッシュもサポートします。

OSキャッシュ

豊富な有効期限ポリシーとクエリ キャッシュのサポートにより、同じ JVM 内でメモリとディスクのキャッシュをサポートします。

SwarmCache

JGroups に基づくクラスター キャッシュ。クラスター化された無効化を使用しますが、Hibernate クエリ キャッシュはサポートしません。

JBossキャッシュ

完全にトランザクション対応で複製されたクラスター化キャッシュ。これも JGroups マルチキャスト ライブラリに基づいています。レプリケーションまたは無効化、同期または非同期通信、楽観的および悲観的ロックをサポートします。Hibernate クエリ キャッシュがサポートされています。

これらのエンジンは、すべての並列アクセス戦略をサポートしているわけではありません。実際の状況を以下の表に示します。

戦略/プロバイダー 読み取り専用 非厳密な読み取り/書き込み 読み書き トランザクション的な
EHCキャッシュ バツ バツ バツ
OSキャッシュ バツ バツ バツ
SwarmCache バツ バツ
JBossキャッシュ バツ バツ

EHCache 構成例

EHCacheエンジンには、ehcache.xml という独自の構成ファイルがあります。このようなファイルのおおよその内容は次のとおりです。

<diskStore path="java.io.tmpdir"/>

<defaultCache
    maxElementsInMemory = "1000"
    eternal = "false"
    timeToIdleSeconds = "120"
    timeToLiveSeconds = "120"
    overflowToDisk = "true"
/>

<cache name = "Employee"
    maxElementsInMemory = "500"
    eternal = "true"
    timeToIdleSeconds = "0"
    timeToLiveSeconds = "0"
    overflowToDisk = "false"
/>

ここでは、一般的なキャッシュ設定と各エンティティのキ​​ャッシュ設定を個別に構成できます。詳細については、公式ドキュメントを参照してください。

キャッシュ統計の分析

キャッシュ メカニズムがどの程度適切に構成されているかを確認する必要がある場合もあります。Hibernate は、このために特別な統計オブジェクトを提供します。

例:

Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);

long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

標準のキャッシュ ソリューションが不足し、手動で改善する必要があるまでにはさらに何年もかかるため、これについては詳しく説明しません。ちなみに、このコメントは同様のケースから抜粋されたものである可能性があります。

// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42