私はトラフィックの多いWebサイトを持っており、私は休止状態を使用しています。また、ehcacheを使用して、ページを生成するために必要なエンティティとクエリをキャッシュします。同じキャッシュ領域の複数の再作成を避ける(並行性のため)
問題は「並列キャッシュミス」であり、長い説明は、アプリケーションが起動してキャッシュ領域が冷たくなったときに、各キャッシュ領域がサイトが存在するために異なるスレッドによって何回も(1回ではなく)同時に多くのユーザーにヒットします。さらに、キャッシュ領域が無効になると、同じ理由で何回も再投入されます。 どうすればこの問題を回避できますか?
私は自分の実装をhibernate.cache.provider_classに提供することによってconvert 1 entity and 1 query cache to a BlockingCacheに管理しましたが、BlockingCacheのセマンティクスは機能していないようです。最悪の場合でも、BlockingCacheデッドロック(ブロック)が発生し、アプリケーションが完全にハングします。スレッドダンプは、get操作でBlockingCacheのmutexで処理がブロックされていることを示します。
したがって、Hibernateはこの種の使用をサポートしていますか?
もしそうでなければ、本番環境でこの問題をどのように解決しますか?
編集:hibernate.cache.provider_classポイントSingletonEhCacheProviderからコピーペーストである私のカスタムキャッシュ・プロバイダーへとstart()メソッド(ライン136の後に)私がやるの終わりに:
Ehcache cache = manager.getEhcache("foo");
if (!(cache instanceof BlockingCache)) {
manager.replaceCacheWithDecoratedCache(cache, new BlockingCache(cache));
}
初期化時に、誰かが "foo"という名前のキャッシュにアクセスする前に、私はそれをBlockingCacheで飾ります。 "foo"はクエリキャッシュであり、 "bar"(同じコードが省略されている)はpojoのエンティティキャッシュです。
編集2:「動作していない」とは、最初の問題がまだ存在することを意味します。キャッシュ "foo"は、並行性のために同じデータで何度も再配置されています。 10個のスレッドでJMeterを使ってサイトにストレスをかけて検証します。私は9つのスレッドが "foo"からデータを要求して(クエリを実行し、キャッシュにデータを格納する)、データをキャッシュから直接取得するまで、ブロックすることを期待しています。
編集3:この問題の別の説明はhttps://forum.hibernate.org/viewtopic.php?f=1&t=964391&start=0ですが、明確な回答はありません。
アン興味深い開発は、今ではehcacheを次のとおりです。http://stackoverflow.com/questions/3472613/does-ehcache-2-1-support -the-transactional-cache-concurrency-in-hibernat/3474011#3474011 – cherouvim