我正在使用带有querydsl的spring数据jpa。我有一个方法,在包含总计数的页面中返回查询结果。获得总计数是昂贵的,我想缓存它。怎么可能?
我天真的做法
@Cacheable("queryCount")
private long getCount(JPAQuery query){
return query.count();
}
不起作用(为了使它工作,他们希望缓存的实际密钥不应该是整个查询,只是标准)。无论如何测试它,没有用,然后我发现了这个:Spring 3.1 @Cacheable - method still executed
我理解这一点的方式我只能缓存公共接口方法。但是在上述方法中,我需要缓存返回值的属性,例如
Page<T> findByComplexProperty(...)
我需要缓存
page.getTotalElements();
注释整个方法是有效的(它是缓存的)但不是我想要的方式。假设总计数需要30秒。因此,对于每个新页面请求,用户需要等待30秒。如果他回到页面,然后使用缓存,但我希望计数只运行一次,然后从缓存中获取计数。
我该怎么做?
答案 0 :(得分:1)
我的解决方案是在创建复杂查询的类中自动装配缓存管理器:
@Autowired
private CacheManager cacheManager;
然后创建一个简单的私有方法getCount
private long getCount(JPAQuery query) {
Predicate whereClause = query.getMetadata().getWhere();
String key = whereClause.toString();
Cache cache = this.cacheManager.getCache(QUERY_CACHE);
Cache.ValueWrapper value = cache.get(key);
if (value == null) {
Long result = query.count();
cache.put(key, result);
return result;
}
return (Long)value.get();
}