1

データベースからキャッシュしたいデータを含むシングルトンがあります。データベースにアクセスし、一定の時間が経過するたびに、データベースを呼び出してデータを更新したいと思います。私が使用したシングルトン パターンは、Effective Java の enum パターンです。これを達成するための最良の方法は何だと思いますか? 理想的には、 MySingleton.INSTANCE が呼び出されるたびに呼び出されるメソッドをオーバーライドします...しかし、そのようなメソッドが存在するかどうかはわかりません。もう 1 つのアイデアは、クライアント コードからアクセスできるすべてのメソッド内に refresh メソッドの呼び出しを含めることです...しかし、これは私には不器用に思えます。

4

3 に答える 3

1

このようなシナリオの場合、堅牢でパフォーマンスが高く、十分にテストされたソリューションは、EHCache のようなキャッシング ライブラリです: http://ehcache.org/

于 2013-09-01T21:29:13.210 に答える
0

必要なのは時間ベースのエビクション キャッシュのようです。Google Guava Cache ライブラリ
をご覧ください。

CacheBuilder は、時限エビクションに対して 2 つのアプローチを提供します。

  • expireAfterAccess(long duration, TimeUnit unit)エントリが読み取りまたは書き込みによって最後にアクセスされてから、指定された期間が経過した後にのみエントリを期限切れにします。エントリが削除される順序は、サイズに基づく削除の順序と似ていることに注意してください。
  • expireAfterWrite(long duration, TimeUnit unit)エントリが作成されてから指定された期間が経過した後、または値の最新の置換後にエントリを期限切れにします。これは、キャッシュされたデータが一定時間後に古くなった場合に望ましい場合があります。

では、どのアプローチが必要ですか?あなたが言った:

データベースにアクセスし、一定の時間が経過するたびに、データベースを呼び出してデータを更新したいと思います。

いつから一定の時間が経過しましたか?

  • エントリが最後にキャッシュから読み取られてから? エントリがデータベースからロードされてからどれだけ時間が経過したかは関係ありませんか? 次に、expireAfterAccess()を使用します
  • エントリが最後にデータベースからキャッシュにロードされてから? 次に、expireAfterWrite()を使用します

両方を同時に使用することもできます。
これはそのような例です: http://mkorytin.blogspot.com/2012/02/caching-objects-with-guava.html

于 2013-09-02T09:03:28.967 に答える