gpt4 book ai didi

java - 使用 Guava 缓存减少样板的方法

转载 作者:行者123 更新时间:2023-12-01 08:08:10 24 4
gpt4 key购买 nike

我有数十个数据访问对象,例如 PersonDao,其方法如下:

Person findById(String id) {}
List<Person> search(String firstName, LastName, Page) {}
int searchCount(String firstName, LastName) {}

我已经尝试过使用这些类之一添加 Guava 缓存,这非常好,但是有很多样板文件。

下面是让 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 来确定调用哪个方法来加载缓存。

我正在努力寻找一种优雅的方法来向这些数据访问对象添加缓存,有什么建议吗?也许 Guava 缓存不适合这个用例?

最佳答案

试试这个。不幸的是,由于泛型而存在编译器警告...但我们可能会抑制它们,因为我们知道不会发生任何不好的事情。

public class CacheContainer {

private static final long maxItemsInCache = 42;
private static final long cacheExpireAfterMinutes = 42;
private final Map<String, LoadingCache> caches = Maps.newHashMap();


public <K, V> V getFromCache(String cacheId, K key, CacheLoader<K, V> loader) throws ExecutionException {
LoadingCache<K, V> cache = caches.get(cacheId);
if (cache == null) {
cache = CacheBuilder.newBuilder().
maximumSize(maxItemsInCache).
expireAfterWrite(cacheExpireAfterMinutes, TimeUnit.MINUTES).
build(loader);
caches.put(cacheId, cache);
}
return cache.get(key);
}
}

然后在你的 dao 中:

private final CacheContainer cacheContainer = new CacheContainer();


public Person findById(String id) {
cacheContainer.getFromCache("personById", id, new CacheLoader<String, Person>() {
@Override
public Person load(String key) {
return findByIdNoCache(key);
});
}

其他方法同理。我认为您无法再减少样板文件了。

关于java - 使用 Guava 缓存减少样板的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19712035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com