0

第 2 レベルのキャッシュとして Hibernate と ehcache を使用しています。

キャッシュされたエンティティ (例: cache-usage="read-write") をロードして更新すると、すぐに SQL UPDATE が発生するようです。

(どのように) この SQL UPDATE が発生するタイミングに影響を与えることができますか?

        hibSession = HibernateUtil.getReadWriteSession();
        tx = hibSession.beginTransaction();
        User u = (User) hibSession.load(User.class, user_id);
        u.modify();
        hibSession.update(u);
        tx.commit();

編集: CacheModeを設定すると効果があるようですが、各 hibSession.update() は、設定した CacheMode に関係なく、すぐに SQL UPDATE になります。

4

1 に答える 1

0

キャッシュされたエンティティ (例: cache-usage="read-write") をロードして更新すると、すぐに SQL UPDATE が発生するようです。

これは私にはとても良いことのようです。

CacheMode を設定すると効果があるようですが、各 hibSession.update() は、設定した CacheMode に関係なく、すぐに SQL UPDATE になります。

SQL UPDATE は、セッションがフラッシュされたとき (tx がここでコミットされたとき) に実行されますが、これは予期された動作です。これを変更できるものは何も見当たらず、CacheModeなぜこの動作を変更したいのか本当に理解できません。つまり、いつUPDATEを実行したいのですか? 取引外?私は何かが欠けているに違いない。明確にできますか?


更新:質問は後書きキャッシュに関するものだったようです。したがって、Terracotta の Hibernate Integrationを引用して明確にします。

後書きキャッシュ

キャッシュについて考えると、次のキャッシュ戦略にたどり着きます。リードスルー キャッシング、ライトスルー キャッシング、ライト ビハインド キャッシングです。Hibernate Second Level キャッシュは Read-Write-Through Cacheであり、キャッシュ ミスが発生した場合、エンティティはデータベースから読み取られ、その後のアクセスのためにキャッシュに渡されます。しかし、H2LC は Write-Behind caching ではありません。Terracotta のディスク永続性と非同期モジュールを使用すると、特定のユースケースで後書きを実装することが非常に効率的になります。現在、Hibernate はデータベースに直接書き込むだけです。代わりに、第 2 レベルのキャッシュと永続的な async-database-queue に書き込むように変更すると、レイテンシが減少し、スループットが劇的に向上します。

後書きは、Hibernate が現在どのように機能するかだけではありません。

于 2010-05-05T23:29:58.933 に答える