Hibernate開発者ドキュメント-章VI。 キャッシング

Hibernateの公匏ドキュメントの第6章の翻蚳を玹介したす。



蚘事の翻蚳は、バヌゞョンHibernate 4.2.19.Finalに関連しおいたす



前章 -Hibernate開発者ドキュメント-章V.ロック



Hibernateの1次および2次キャッシュずは、次の図に瀺されおいたす 著者のメモ 。



画像

6.1。 リク゚ストキャッシュ



同じパラメヌタヌで繰り返し実行されるク゚リがある堎合、ク゚リキャッシングによりパフォヌマンスが向䞊したす。



キャッシュにより、远加のトランザクションオヌバヌヘッドが発生したす。 たずえば、オブゞェクトに関するク゚リの結果をキャッシュする堎合、Hibernateはオブゞェクトぞの倉曎がコミットされたかどうかを監芖し、それに応じおキャッシュ゚ントリを砎棄する必芁がありたす。 さらに、ク゚リキャッシングの利点は限られおおり、アプリケヌションの䜿甚パタヌンに倧きく䟝存したす。 これらの理由により、Hibernateはデフォルトでク゚リのキャッシュを無効にしたす。



手順6.1。 ク゚リキャッシュを蚱可する



  1. hibernate.cache.use_query_cacheプロパティをtrueに蚭定したす 。



    この蚭定により、2぀の新しいキャッシュ領域が䜜成されたす。



    • org.hibernate.cache.internal.StandardQueryCacheはキャッシュされたク゚リの結果を保存したす。
    • org.hibernate.cache.spi.UpdateTimestampsCacheは、芁求されたテヌブルに最近の曎新のタむムスタンプを保存したす。 これらのタむムスタンプは、ク゚リキャッシュから取埗した結果を怜蚌したす぀たり、それらを介しお、オブゞェクトの関連性がチェックされたす- およそTransl 。


  2. キャッシュ領域のタむムアりトを構成する



    キャッシュの実装でタむムアりトたたは有効期限を構成する堎合、 UpdateTimestampsCacheの基瀎ずなるキャッシュ領域のタむムアりトを、芁求キャッシュのタむムアりトよりも倧きい倀に蚭定したす。 UpdateTimestampsCacheリヌゞョンに無期限のタむムアりトを蚭定するこずは可胜であり、掚奚されおいたす。 より具䜓的には、LRUキャッシングポリシヌ最長未䜿甚時間は適切ずは芋なされたせん。

  3. 特定のク゚リの結果キャッシュを蚱可する



    ほずんどのリク゚ストはキャッシングの恩恵を受けないため、キャッシングが普遍的に有効になった埌でも、個々のリク゚ストに察しおキャッシングを蚱可するだけで枈みたす。 特定のリク゚ストのキャッシュを有効にするには、 org.hibernate.Query.setCacheabletrueを呌び出したす 。 この呌び出しにより、リク゚ストは実行前にキャッシュを「芋る」か、実行埌に結果をそこに眮くこずができたす。



ク゚リキャッシュは、キャッシュ内の関連する゚ンティティの状態をキャッシュしたせん。 識別子の倀をキャッシュし、結果を入力したす。 したがっお、芁求キャッシュの䞀郚ずしおキャッシュする必芁がある゚ンティティに察しおは、垞に2次キャッシュず組み合わせた芁求キャッシュを䜿甚したす。



6.1.1。 芁求キャッシュ領域



ク゚リキャッシュの有効期限ポリシヌをより適切に制埡するには、 Query.setCacheRegionを呌び出しお、特定のク゚リの名前付きキャッシュ領域を指定したす。



䟋6.1。 SetCacheRegionメ゜ッド



List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger") .setEntity("blogger", blogger) .setMaxResults(15) .setCacheable(true) .setCacheRegion("frontpages") .list();
      
      





ク゚リキャッシュにその領域の1぀を匷制的に曎新させ、キャッシュされたデヌタを無芖するには、 org.hibernate.Query.setCacheModeCacheMode.REFRESHを呌び出したす。 ク゚リ甚に定矩されたリヌゞョンず組み合わせお、Hibernateはそのリヌゞョンにキャッシュされた結果を遞択的に曎新したす。 これは、 org.hibernate.SessionFactory.evictQueriesを䜿甚しおリヌゞョンからレコヌドを䞀括削陀するよりも効率的です。



6.2。 レむダヌ2キャッシュプロバむダヌ



Hibernateは、䞀郚の二次キャッシュプロバむダヌず互換性がありたす。 Hibernateで定矩されおいるすべおの可胜なキャッシュ戊略をサポヌトするプロバむダヌはありたせん。 セクション6.2.3「Hibernateのレむダヌ2キャッシュプロバむダヌ」には、プロバむダヌのリストず、そのむンタヌフェヌスおよびサポヌトされるキャッシュ戊略が含たれおいたす。 キャッシング戊略の定矩に぀いおは、 セクション6.2.2「キャッシング戊略」を参照しおください。



6.2.1。 カスタムキャッシュプロバむダヌの構成



泚釈たたはマッピングファむルを䜿甚しお、キャッシュプロバむダヌを構成できたす。 ゚ンティティは、デフォルトでは2次キャッシュの䞀郚ではないため、䜿甚は掚奚されおいたせん。 ただ゚ンティティを䜿甚する必芁がある堎合は、 shared-cache-mode芁玠をpersistence.xmlに蚭定するか、構成でjavax.persistence.sharedCache.modeプロパティを䜿甚したす。 è¡š6.1「共有キャッシュモヌドに蚭定可胜な倀」のいずれかの倀を䜿甚したす。



è¡š6.1。 共有キャッシュモヌドの可胜な倀

䟡倀 説明
ENABLE_SELECTIVE 明瀺的にキャッシュ可胜ずしおマヌクしない限り、゚ンティティはキャッシュされたせん。

この倀は掚奚され、デフォルトで䜿甚されたす。
DISABLE_SELECTIVE ゚ンティティは、明瀺的にキャッシュをキャンセルするたでキャッシュされたす。
すべお キャッシュなしずしおマヌクするかどうかに関係なく、すべおの゚ンティティがキャッシュされたす。
なし ゚ンティティをキャッシュ可胜ずしおマヌクしおも、゚ンティティはキャッシュされたせん。 このオプションはキャンセルしたす

二次キャッシュ操䜜。


グロヌバルな䞊行性戊略は、 hibernate.cache.default_cache_concurrency_strategyプロパティを䜿甚しお蚭定されたす。 6.2.2項「キャッシング戊略」の可胜な倀を参照しおください。



重芁です
可胜な限り、特定の゚ンティティに察しおのみ䞊行凊理キャッシュ戊略を定矩したすが、グロヌバルには定矩したせん。 アノテヌション@ org.hibernate.annotations.Cacheを䜿甚したす。



䟋6.2 泚釈を䜿甚しおキャッシュプロバむダヌを構成したす。

 @Entity @Cacheable @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Forest { ... }
      
      





コレクションに他の゚ンティティが含たれおいる堎合、コレクションたたは識別子のコンテンツをキャッシュできたす。 コレクションプロパティで@Cacheアノテヌションを䜿甚したす。



@Cacheにはいく぀かの属性が含たれおいたす。



@Cacheアノテヌションの属性 

名 説明
䜿い方 指定されたキャッシュの䞊行性戊略。

  • なし
  • READ_ONLY
  • NONSTRICT_READ_WRITE
  • READ_WRITE
  • トランザクション


地域 キャッシング地域 この属性はオプションであり、デフォルトでは完党なクラス名になりたす。たたは

コレクションの修食されたロヌル名
含む すべおのプロパティを含めるかどうか。 オプションで、2぀の可胜な倀を取るこずができたす。

  • すべおの倀-すべおのプロパティが含たれたす。 デフォルトで䜿甚されたす。
  • 非遅延倀には、非遅延プロパティのみが含たれたす。






䟋6.3 マッピングファむルを䜿甚したキャッシュプロバむダヌの構成。

 <cache usage="transactional" region="RegionName" include="all" />
      
      





䟋6.2「アノテヌションを䜿甚したキャッシュプロバむダヌの蚭定」のように、マッピングファむルで属性を指定できたす。 マッピングファむルの属性の構文には、いく぀かの特定の違いがありたす。

名 説明
䜿い方 キャッシング戊略。 この属性は必須であり、次のいずれかの倀を取るこずができたす。

  • トランザクション
  • 読み曞き
  • 非厳密な読み曞き
  • 読み取り専甚


地域 2次キャッシュ領域の名前。 デフォルトでは、完党修食クラス名たたはロヌルコレクション名ず䞀臎したす。
含む 有効にするず、lazy = trueで指定された゚ンティティプロパティをキャッシュできたすか

「遅延」属性レベルのサンプリング。 デフォルトはすべおで、遅延なしでもかたいたせん


cacheの代わりに、 hibernate.cfg.xmlの class-cache 、 collection-cache芁玠を䜿甚できたす。



6.2.2。 キャッシング戊略





6.2.3。 Hibernateレむダヌ2キャッシュプロバむダヌ



キャッシュ サポヌトされおいる戊略
HashTableテストのみ
  • 読み取り専甚
  • 非厳密な読み曞き
  • 読み曞き
゚ハチェ
  • 読み取り専甚
  • 非厳密な読み曞き
  • 読み曞き
  • トランザクション
むンフィニスパン
  • 読み取り専甚
  • トランザクション


6.3。 キャッシュ管理



6.3.1。 キャッシュ゚ントリの远加/取埗



内郚セッションキャッシュに゚ントリを远加するアクション

゚ンティティの保存たたは曎新 ゚ンティティを抜出
  • 保存
  • 曎新
  • saveOrUpdate
  • 負荷
  • 取埗
  • リスト
  • 反埩
  • スクロヌル


キャッシュされたレコヌドを同期たたは削陀したす。 flushメ゜ッドを呌び出すず、オブゞェクトの状態はデヌタベヌスず同期されたす。 同期を回避するために、 evictメ゜ッドを䜿甚しお、オブゞェクトずそのコレクションを䞀次キャッシュから削陀できたす。 セッションキャッシュからすべおの゚ントリを削陀するには、 Session.clearメ゜ッドを䜿甚したす 。



䟋6.4 䞀次キャッシュから゚ントリを削陀する

 ScrollableResult 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メ゜ッドを提䟛しお 、オブゞェクトがセッションキャッシュに属しおいるかどうかを刀断したす。



䟋6.5 L2キャッシュからの削陀

SessionFactoryメ゜ッドを䜿甚しお、゚ンティティのキ​​ャッシュ状態、クラス党䜓、コレクション、たたはコレクションのすべおのロヌルを削陀できたす。

 sessionFactory.getCache().containsEntity(Cat.class, catId); // is this particular Cat currently in the cache sessionFactory.getCache().evictEntity(Cat.class, catId); // evict a particular Cat sessionFactory.getCache().evictEntityRegion(Cat.class); // evict all Cats sessionFactory.getCache().evictEntityRegions(); // evict all entity data sessionFactory.getCache().containsCollection("Cat.kittens", catId); // is this particular collection currently in the cache sessionFactory.getCache().evictCollection("Cat.kittens", catId); // evict a particular collection of kittens sessionFactory.getCache().evictCollectionRegion("Cat.kittens"); // evict all kitten collections sessionFactory.getCache().evictCollectionRegions(); // evict all collection data
      
      







6.3.1.2。 2次キャッシュずク゚リキャッシュの内容を衚瀺する



統蚈が解決されるず、2次キャッシュたたはキャッシュ領域の内容を衚瀺できたす。



手順6.2 統蚈分解胜

  1. hibernate.generate_statisticsをtrueに蚭定したす 。
  2. オプション-hibernate.cache.use_structured_entriesをtrueに蚭定しお、Hibernateがナヌザヌフレンドリヌな圢匏でレコヌドを保存できるようにしたす。




䟋6.6 Statistics APIを介したL2キャッシュの衚瀺

 Map cacheEntries = sessionFactory.getStatistics() .getSecondLevelCacheStatistics(regionName) .getEntries();
      
      






All Articles