停止 Ehcache 存储空值

Stop Ehcache store null values

我有一个应用程序使用 ehcache 版本:2.9.0,我不想存储 return 空值的 QueryCache。

搜索我发现了这个 link: http://www.ehcache.org/documentation/2.8/recipes/cachenull.html

为了实现上面的cachenull,发现了这个ideia: https://gist.github.com/bivas/1196809

我实现了 CacheEventListener 来删除空对象键,就像在 github link 中一样,但不起作用,因为 element.getObjectValue() 永远不会为 NULL,即使 select 结果为空。

显示查询缓存的内容:

1) - 第一个 select,没有找到 pessoaID = 999,因此结果为 null

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) - 第二个 select,发现 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() 的 return 是一个对象)并且有一个常数:6119085270048768 仅在第一个 select 和第二个 select 中有 6119085270048768 和select 的 return: 1

如何进行对象值的验证?换句话说,如何禁用ehcache存储空值?

this article 中所述,第一个参数是单调递增的时间戳值,在将查询缓存结果与基础 table 空间修改进行比较时用于数据一致性。

空结果被缓存,这不是真正的问题,因为只要没有人修改底层实体,您就可以重用此查询结果。

为什么要禁用缓存空结果?我认为目前的做法是正确的,我认为没有任何设置可以使空结果不被缓存。

我开发的这种方法,听起来有点 "code smell",但是有效。

@Override
public void notifyElementPut(final Ehcache cache, final Element element) throws CacheException {

   Map elementValue = (Map) element.getObjectValue();
   if(elementValue.size() <= 1){
       remove(element);
   }
}