我正在使用Guava LoadCache来存储数据库查询的结果。但是,尽管没有设置逐出策略,但通过 getFromCache(( 对缓存执行 get 会导致每次都命中 CacheLoader load(( 方法中的调试点,因此也会导致数据库查询方法 getKeyFromDatabase(( 中的调试点每次都被命中。
这是我的代码:
private final LoadingCache<String, QueryResult> cache;
public MyDao() {
cache = CacheBuilder.newBuilder()
.maximumSize(40)
.build(new CacheLoader<String, QueryResult>() {
@Override
public QueryResult load(String key) throws DatabaseException {
return getKeyFromDatabase(key);
}
});
}
public QueryResult getFromCache(String key) throws DatabaseException {
try {
return cache.get(key);
} catch (ExecutionException e) {
throw new DatabaseException(e);
}
}
private QueryResult getKeyFromDatabase(String key) throws DatabaseException {
try {
...
return new QueryResult();
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
我在这里错过了一些明显的东西吗?
好吧,假警报伙计们,番石榴实际上并没有坏(惊喜(。原因是实例化 DAO 的代码每次都实例化一个新对象,因此每次也会实例化一个新的缓存。我将缓存设置为静态变量,现在可以工作了。