3

Hibernate Second level cache について学び始めました。

Hibernate のセカンド レベル キャッシュを理解するために、次のサンプル コードを試してみました。

Session session = sessionFactory.openSession();
session.beginTransaction();
UserDetails u1 = (UserDetails) session.get(UserDetails.class,1);
session.getTransaction().commit();
session.close();
Session session2=sessionFactory.openSession();
session2.beginTransaction();
UserDetails u2 = (UserDetails) session2.get(UserDetails.class, 1);
session2.getTransaction().commit();
System.out.println(u1==u2);
session2.close();

2 つの異なるセッションで同じ UserDetails オブジェクト (ID として「1」) を読み取っています。二次キャッシュを有効にしたのと同じオブジェクトを返す必要があります。

しかし、両方のオブジェクトを比較すると、「false」が表示されます。

休止状態の二次キャッシュが内部でどのように機能するか教えてもらえますか?

4

1 に答える 1

7

2 番目のレベルのキャッシュには、エンティティのインスタンスは格納されません。このエンティティに対応する行の内容を格納します。また、エンティティ インスタンスを格納したとしても、同じインスタンスを別のトランザクションに返すと、アプリケーションが完全に壊れてしまいます。並行して実行されている別のトランザクションは、スレッドセーフではない同じオブジェクトを変更し、トランザクション間の分離はなくなります。

したがって、すべてのトランザクションには、2 番目のレベルのキャッシュが使用されている場合でも、常に個別のエンティティ インスタンスが含まれます。

2 番目のキャッシュがヒットしたことを確認するには、SQL ログを有効にし、データを読み込むクエリが 2 回ではなく 1 回実行されていることを確認します。

于 2013-11-11T10:27:55.663 に答える