Guava LoadingCache每次为相同的密钥加载新值

时间:2014-12-17 20:54:24

标签: java caching guava

我正在使用Guava LoadingCache来存储数据库查询的结果。但是,尽管没有设置逐出策略,通过getFromCache()进行缓存,导致我的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);
    }
}

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

好的误报家伙,番石榴实际上并没有被打破(惊喜)。原因是导致实例化DAO的代码每次都实例化一个新对象,因此每次都会实例化一个新的缓存。我将缓存设为静态变量,现在可以正常工作。