私はL1キャッシュとL2キャッシュを使用する標準的な目的に関する一般的な情報がほしいだけです。ORMメカニズムとしてHibernateを使用するWebアプリケーションのL1キャッシュとL2キャッシュの違いは何ですか?
テラコッタを2次キャッシュとして使用しているシステムを調べていて、1次キャッシュがあることがわかりました。
私はL1キャッシュとL2キャッシュを使用する標準的な目的に関する一般的な情報がほしいだけです。ORMメカニズムとしてHibernateを使用するWebアプリケーションのL1キャッシュとL2キャッシュの違いは何ですか?
テラコッタを2次キャッシュとして使用しているシステムを調べていて、1次キャッシュがあることがわかりました。
HibernateがNHibernateに似ている場合(それ以外の場合を除いて)、Session
は第1レベルのキャッシュです。それは一般的な意味でキャッシュではなく、アイデンティティマップです。
JPA/Hibernate(および他の同様のORMツール)では、L1キャッシュはトランザクションキャッシュです。つまり、トランザクションを開いて閉じるときに格納されたエンティティです。これはほとんどの場合共有キャッシュではありません(他のスレッドはそれを利用できません)。 JPAでは、これは通常EntityManagerによって保持されます。
L2キャッシュは完全(通常)共有キャッシュです。データを取り込む複数のスレッド/クエリがある場合、キャッシュ内にまだ存在する他のスレッドによって既に取り出されたエンティティを利用できます。 JPAでは、これは通常EntityManagerFactoryによって保持されます。
GaryFが間違っていないですが、アントンはこの上より正確であるが、彼の答え補完するために、右:-)技術的ではありません。
ファーストレベルキャッシュ:これは知られているすべてのエンティティを保存する「キャッシュ」であります特定のセッションによって。したがって、このセッション内に3つのトランザクションがある場合、3つのトランザクションすべてに触れたすべてのエンティティを保持します。セッションを閉じるか、 "クリア"メソッドを実行すると、クリアされます。
第2レベルキャッシュ:これは「実際の」キャッシュであり、Infinisanなどの外部プロバイダに委任されます。このキャッシュでは、キャッシュの内容を完全に制御することができます。つまり、削除するエントリを指定することができます。どのエントリを長くしておくべきかを指定できます。
L1キャッシュは、Hibernateセッションごとに存在するキャッシュであり、このキャッシュはスレッド間で共有されません。このキャッシュは、Hibernate自身のキャッシングを利用します。
L2キャッシュは、Hibernateセッションを超えても存続し、スレッド間で共有できるキャッシュです。このキャッシュには、EHCacheのようなHibernateに付属するキャッシュ実装か、JBossCache2のようなものを使用できます。
第1レベルのキャッシュでは、キャッシュがいっぱいになるとどうなりますか?キャッシュがクリアされる2つのケースについて言及しましたが、キャッシュが満杯になったときに「最後に使用された」または同様のアルゴリズムに従って自動的にクリアされることは間違いありません。それ以外の場合、メモリ不足例外が発生するか、その時点以降にキャッシュに何も格納されません。 – KyleM
これをドキュメントや自分で試してみるといいかもしれませんが、覚えている限り、第1レベルキャッシュのエントリは削除されません。したがって、膨大な量のデータに影響を与えるトランザクションがある場合は、実際にバッチ処理のようなメモリ不足例外が発生する可能性があります。この「エッジ」の場合、StatelessSession(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/StatelessSession.html)を使用することができます。 – jpkrohling