Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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 为什么hibernate/ehcache二级缓存在同一个会话中总是丢失?_Java_Hibernate_Ehcache - Fatal编程技术网

Java 为什么hibernate/ehcache二级缓存在同一个会话中总是丢失?

Java 为什么hibernate/ehcache二级缓存在同一个会话中总是丢失?,java,hibernate,ehcache,Java,Hibernate,Ehcache,我有一个长期运行的EntityManager,我会定期清除它()。我在我的一个实体上配置了读写缓存 我已经做了一些调查,我可以看到实体存在于缓存中。我甚至可以看到一个缓存命中从。但是,如果实体的时间戳晚于创建会话时的时间戳,ehcache将不会返回该实体:请参阅 这种行为的原因是什么?有没有一种方法可以定制hibernate或ehcache以在单个EntityManager中实现缓存命中率?正如JavaDoc所说:时间戳表明实体是在事务启动后创建的,因此事务不可能看到它(根据) 因此,您似乎有几

我有一个长期运行的EntityManager,我会定期清除它()。我在我的一个实体上配置了读写缓存

我已经做了一些调查,我可以看到实体存在于缓存中。我甚至可以看到一个缓存命中从。但是,如果实体的时间戳晚于创建会话时的时间戳,ehcache将不会返回该实体:请参阅


这种行为的原因是什么?有没有一种方法可以定制hibernate或ehcache以在单个EntityManager中实现缓存命中率?

正如JavaDoc所说:时间戳表明实体是在事务启动后创建的,因此事务不可能看到它(根据)


因此,您似乎有几个事务,例如A和B。您先启动B,然后A,然后A创建实例X,然后B尝试查找X->缓存未命中,因为A尚未提交(例如)。

这似乎是读写缓存的一个属性:您无法从同一会话中创建的缓存中提取实体

非严格读写缓存不比较时间戳,因此在第一次加载()后,这确实实现了缓存命中


更好的是,事务缓存在persist()之后填充缓存,因此第一次加载()将导致缓存命中。由于我与数据库的交互完全在单个JVM中的单个线程中进行,因此我相信这是安全的。

很抱歉指出一个明显的问题,但是您是否覆盖了equals和hashcode?如果您已经这样做了,您确定它们是正确的吗?在实体上?是的,我有。但我不确定这是否重要,因为Hibernate不将实体本身存储在二级缓存中。实体是在会话创建之后创建的,但它是在以前的事务中创建的。我的应用程序没有任何并发事务。EHCache认为不同,所以很可能你错了。我建议在事务创建/提交中添加日志记录,以确保满足您的期望。我已经完成了日志记录和调试。当我为每个persist()和getReference()操作创建新会话时,我会得到缓存命中,但当我在单个会话中持久化、提交、清除()和getReference()时,我会得到缓存未命中。这是有意义的。如果是同一个会话,hibernate可能希望在一级缓存中找到它,或者它正在等待刷新以查看实体是否有效