2011-04-15 6 views
8

レイテンシが最も重要な高性能Java(J2SE)ミドルウェアアプリケーションがあります。レガシー・データベースに保持されているいくつかのスタンディング・データを使用します。レガシー・アプリケーションでは、時々、データが変更される可能性があります。レイテンシが必要なため、JPAをHibernateと、またEhcacheなどのキャッシュプロバイダを利用してキャッシュする予定です。JPAバックグラウンドキャッシュリフレッシュ

ただし、スタンディングデータが(従来のアプリによって)更新される場合は、できるだけ早くこれを通知する必要があります。私はキャッシュの有効期限を設定することを考えていましたが、データの次の要求がアプリケーションによって行われるまで、キャッシュはリフレッシュされません。その時点で、データベースの再読み込みのために遅延が発生します。

理想的には、古い値を返すためにキャッシュが必要であり、バックグラウンドでは、定期的にデータベースからの最新の値でキャッシュが更新/リフレッシュされます。

これはEhcacheで可能ですか?私はSelfPopulatingCacheとCacheLoaderを見てきましたが、これは私が多くの作業をしているようです(各エンティティのコードを書く必要があります)。また、誰にもCacheLoader実装の例がありますか?私は、クエリキャッシュ上の非同期リフレッシュオプションを期待していました。

ソリューションを提供できる他の技術はありますか?私たちはJPAプロバイダやキャッシュプロバイダに縛られていません。

Spring @Cacheableで解決策を提供できますか?私はspring ehcache cachableがself-populating-cache-scopeを言及しているのを見てきましたが、それがどういう意味なのかわかりません。

ありがとうございます。

+0

レガシーアプリケーションで使用できる統合オプションは何ですか? – Santosh

答えて

1

レガシーアプリケーションを変更できる場合は、ActiveMQのようなものでキャッシュ無効化通知を送信することもできます。レガシーアプリケーションを変更できない場合は、インデックス付きのタイムスタンプ/ローバージョン列をテーブルに追加し、以前のポーリング以降の変更を定期的にポーリングします。

5

どのデータベースをお使いですか?

EclipseLink 2.4は、データベースイベント駆動型キャッシュ無効化機能を提供します。これはOracleデータベースDCN/QCNと統合されています。何かをトリガーで引っ張ることもできます。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/DCN

また、Oracle GoldenGateは、一貫性とTopLinkのグリッドを調査することを望むかもしれません。

1

私はEhCacheまたは他のコンポーネントを使ってこれを行う方法を知らないが、この問題に対する共通のアプローチは「2つのキャッシュを持つ」ことである。私は説明しましょう:データを持つアプリケーションに1つのキャッシュ(このキャッシュはアプリケーションを提供している間は更新されません)と最新のデータを持つ時間指定の従業員によって作成された別のキャッシュBeeing(毎秒または毎回キャッシュを作成できますデータが変更されたことを知らせるイベントが表示されます)。新しいキャッシュが完了すると、古いキャッシュを新しいキャッシュに置き換えます。したがって、最近更新されたキャッシュは、キャッシュ遅延が0のアプリケーションを処理しています。ご覧のとおり、この方法の問題は、新しいキャッシュが完了していない間にクライアントが古いデータを参照する可能性があることです。そして、もちろん、それは非常に高価な方法です(あなたは非常に頻繁にメモリに2つのキャッシュを持ち、非常に頻繁に新しいキャッシュを構築します)。