我有一个应用程序使用ehcache版本:2.9.0并且我不想存储返回空值的QueryCache。
搜索我发现此链接: http://www.ehcache.org/documentation/2.8/recipes/cachenull.html
为了实现上面的cachenull,找到了这个ideia: https://gist.github.com/bivas/1196809
我实现了CacheEventListener以删除空对象键,就像在github链接中一样,但不起作用,因为即使select结果为null,element.getObjectValue()也永远不会为NULL。
显示queryCache的内容:
1) - 首先选择,没有找到pessoaID = 999,因此结果为空
Element: [
key = sql: select pessoa0_.PESSOA as PESSOA1_14_, from schema.PESSOA pessoa0_ where pessoas0_.ID=?; parameters: ; named parameters: {pID=999};
transformer: org.hibernate.transform.CacheableResultTransformer@110f2,
keyValue=[6119085270048768],
version=1,
hitCount=0,
CreationTime = 1493917302268,
LastAccessTime = 1493917302268 ]
2) - 第二次选择,发现pessoaID = 1
Element: [
key = sql: select pessoa0_.PESSOA as PESSOA1_14_, from schema.PESSOA pessoa0_ where pessoas0_.ID=?; parameters: ; named parameters: {pID=999};
transformer: org.hibernate.transform.CacheableResultTransformer@110f2,
keyValue=[6119085270048768, 1],
version=1,
hitCount=0,
CreationTime = 1493917304047,
LastAccessTime = 1493917304047 ]
P.S:注意'keyValue'。是一个ArrayList(在调试中看到,因为返回方法getObjectValue()是一个Object)并且具有一个常数:6119085270048768只在第一个选择中,第二个选择有6119085270048768并且返回select:1
如何验证对象值?换句话说,如何禁用ehcache来存储空值?
答案 0 :(得分:0)
如this article中所述,第一个参数是单调递增的时间戳值,用于在将查询缓存结果与基础表空间修改进行比较时用于数据一致性。
空结果被缓存,这并不是真正的问题,因为只要没有人修改底层实体,你就可以重用这个查询结果。
为什么要禁用缓存的空结果?我认为当前的方法是正确的,我认为没有任何设置可以使空结果不被缓存。
答案 1 :(得分:0)
我开发的这种方法听起来有点“代码味道”,但有效。
@Override
public void notifyElementPut(final Ehcache cache, final Element element) throws CacheException {
Map elementValue = (Map) element.getObjectValue();
if(elementValue.size() <= 1){
remove(element);
}
}