Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 停止缓存存储空值_Java_Hibernate_Caching_Ehcache - Fatal编程技术网

Java 停止缓存存储空值

Java 停止缓存存储空值,java,hibernate,caching,ehcache,Java,Hibernate,Caching,Ehcache,我有一个应用程序使用ehcache版本:2.9.0,我不想存储返回空值的QueryCache 搜索时,我找到了此链接: 为了实现上面的cachenull,我们找到了以下ideia: 我实现了CacheEventListener来删除null objects键,就像在github链接中一样,但不起作用,因为即使select结果为null,元素.getObjectValue()也从不为null 显示queryCache的内容: 1) -首先选择,未找到pessoaID=999,因此结果为空 元素

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

搜索时,我找到了此链接:

为了实现上面的cachenull,我们找到了以下ideia:

我实现了CacheEventListener来删除null objects键,就像在github链接中一样,但不起作用,因为即使select结果为null,元素.getObjectValue()也从不为null

显示queryCache的内容:

1) -首先选择,未找到pessoaID=999,因此结果为空

元素:[
key=sql:从schema.PESSOA pessoa0_u0.ID=?;参数:;命名参数:{pID=999}中选择pessoa0_u0.PESSOA作为PESSOA1_14_0;
transformer:org.hibernate.transform。CacheableResultTransformer@110f2, 
keyValue=[6119085270048768],
版本=1,
命中率=0,
CreationTime=149391732268,
LastAccessTime=149391732268]
2) -第二次选择,发现pessoaID=1

元素:[
key=sql:从schema.PESSOA pessoa0_u0.ID=?;参数:;命名参数:{pID=999}中选择pessoa0_u0.PESSOA作为PESSOA1_14_0;
transformer:org.hibernate.transform。CacheableResultTransformer@110f2, 
keyValue=[6119085270048768,1],
版本=1,
命中率=0,
CreationTime=149391734047,
LastAccessTime=149391734047]
p.S:注意“关键价值”。是一个ArrayList(在调试中看到,因为方法getObjectValue()的返回是一个对象),并且只有一个常量:6119085270048768仅在第一次选择中,第二次选择有6119085270048768,选择的返回:1

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

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

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

为什么要禁用要缓存的空结果?我认为当前的方法是正确的,并且我不认为有任何设置会导致未缓存的空结果。

如中所述,第一个参数是一个单调递增的时间戳值,当比较查询缓存结果与基础表空间修改时,该值用于数据一致性

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


为什么要禁用要缓存的空结果?我认为当前的方法是正确的,而且我不认为有任何设置会因为没有缓存而导致空结果。

我开发的这种方法,听起来有点“代码味道”,但很有效

@覆盖
public void notifyElementPut(最终Ehcache缓存,最终元素)引发CacheException{
Map elementValue=(Map)元素。getObjectValue();

if(elementValue.size()我开发的这种方法听起来有点“代码味道”,但很有效

@覆盖
public void notifyElementPut(最终Ehcache缓存,最终元素)引发CacheException{
Map elementValue=(Map)元素。getObjectValue();

如果(elementValue.size()Vlad),则会有其他系统写入我的数据库,因此select在一瞬间找不到任何内容(返回null),但会插入下一个寄存器的句点。如果不执行:executeQueryRegion(“我的\区域\查询\缓存”),select never将返回正确的。在这种情况下,您需要使用到期时间,它看起来不像到期时间。请看上面所附的示例a,它更糟?到期时间对我来说不起作用,因为在“my-query-cache-region-1”中如果选择了很多实体,我将丢失1000个选择,因为只有一个返回空值?为什么不使用数据库缓冲池,而使用更多复制的从属节点?这是解决此类问题的一致方法。查询缓存很少使用VLAD,还有其他系统写入我的数据库,因此在一瞬间无法执行选择查找任何内容(返回null),但插入了寄存器下一个句点。如果不执行:executeQueryRegion(“my_region\u query\u cache”),则select将永远不会返回正确的值。在这种情况下,您需要使用到期时间,它看起来不像到期时间。查看上面所附的示例a,它更糟糕?到期时间对我来说不起作用,因为在“my-query-cache-region-1”有很多选择的实体,我将丢失1000个选择,因为只有一个返回null?为什么不使用数据库缓冲池和更多复制的从属节点?这是解决此类问题的一致方法。查询缓存很少有用