停止 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);
}
}
我有一个应用程序使用 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);
}
}