Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

20.3. キャッシュの管理

オブジェクトを save()update()saveOrUpdate() に渡すとき、そして load()get()list()iterate()scroll() を使ってオブジェクトを取得するときには常に、そのオブジェクトは Session の内部キャッシュに追加されます。
次に flush() が呼ばれると、オブジェクトの状態はデータベースと同期化されます。この同期が起こることを望まないときや、膨大な数のオブジェクトを処理していてメモリを効率的に扱う必要があるときは、evict() メソッドを使って一次キャッシュからオブジェクトやコレクションを削除することが出来ます。
ScrollableResults cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
while ( cats.next() ) {
    Cat cat = (Cat) cats.get(0);
    doSomethingWithACat(cat);
    sess.evict(cat);
}
Session はインスタンスがセッションキャッシュに含まれるかどうかを判断するための contains() メソッドも提供します。
すべてのオブジェクトをセッションキャッシュから完全に取り除くには、 Session.clear() を呼び出してください。
二次キャッシュのために、 SessionFactory にはインスタンス、クラス全体、コレクションのインスタンス、コレクション全体をキャッシュから削除するためのメソッドがそれぞれ定義されています。
sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class);  //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections

注記

このメソッドは、アプリケーションがSessionFactory.evictXXX(..., Serializable id) APIを利用した結果呼び出されます。このAPIを使うアプリケーションは、呼び出しが別のトランザクションがJBoss Cache ベースの二次キャッシュで完了するのを待機させないようにする場合がある点を認識しなければなりません。
さらに、トランザクション中に発生するこれらの呼び出しは、トランザクションがコミットするまでロックを保持し、コミットが終わってから他のノードを更新します。これが問題となる場合、トランザクションの開始前、トランザクションのコミット後にエビクションを行うと有効となる場合があります。
CacheMode は特定のセッションが二次キャッシュとどのように相互作用するかを制御します。
  • CacheMode.NORMAL:アイテムの読み込みと書き込みで二次キャッシュを使います
  • CacheMode.GET:読み込みは二次キャッシュから行いますが、データを更新した場合を除いて二次キャッシュに書き込みをしません。
  • CacheMode.PUT:二次キャッシュにアイテムを書き込みますが、読み込みには二次キャッシュを使いません。
  • CacheMode.REFRESH:二次キャッシュにアイテムを書き込みますが、読み込みには二次キャッシュを使いません。hibernate.cache.use_minimal_puts の影響を受けずに、データベースから読み込むすべてのアイテムの二次キャッシュを強制的にリフレッシュします。
二次キャッシュの内容やクエリキャッシュ領域を見るために、 Statistics API を使ってください:
Map cacheEntries = sessionFactory.getStatistics()
        .getSecondLevelCacheStatistics(regionName)
        .getEntries();
統計情報を有効にして、さらにオプションとして、キャッシュエントリをより読解可能な形式で保持することを Hibernate に強制する必要があります:
hibernate.generate_statistics true
hibernate.cache.use_structured_entries true