次のようなメソッドを持つ PersonDao のようなデータ アクセス オブジェクトが多数あります。
Person findById(String id) {}
List<Person> search(String firstName, LastName, Page) {}
int searchCount(String firstName, LastName) {}
これらのクラスの 1 つを使用してグアバ キャッシュを追加して実験しましたが、これは非常に優れていますが、ボイラープレートがたくさんあります。
findById が最初にキャッシュを参照するようにする例を次に示します。
private final LoadingCache<String, Person> cacheById = CacheBuilder.newBuilder()
.maximumSize(maxItemsInCache)
.expireAfterWrite(cacheExpireAfterMinutes, TimeUnit.MINUTES)
.build(new CacheLoader<String, Person>() {
public Person load(String key) {
return findByIdNoCache(key);
});
//.... and update findById to call the cache ...
@Override
public Person findById(String id) {
return cacheById.getUnchecked(id);
}
したがって、各メソッドには異なるパラメーターと戻り値の型があるため、メソッドごとに個別の cacheLoader を作成することになります!
オブジェクト型を返し、オブジェクトのマップを受け入れる単一の CacheLoader にすべてを統合しようとしましたが、キャッシュをロードするためにどのメソッドを呼び出すかを判断するために、大きな醜い if/else が発生します。
これらのデータ アクセス オブジェクトにキャッシュを追加するエレガントな方法を見つけるのに苦労しています。何か提案はありますか? たぶん、グアバキャッシュはこのユースケース向けではありませんか?