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

时间:2011-06-10 11:47:43

标签: java hibernate ehcache

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

我做了一些调查,我可以看到实体存在于缓存中。我甚至可以看到来自net.sf.ehcache.Cache.searchInStoreWithStats()的缓存命中。但是,如果实体的时间戳晚于创建会话的时间戳,则ehcache将不会返回该实体:请参阅AbstractReadWriteEhcacheAccessStrategy.get(Object, long)

这种行为的原因是什么?有没有办法可以自定义hibernate或ehcache来实现单个EntityManager中的缓存命中?

2 个答案:

答案 0 :(得分:3)

看起来这是读写缓存的属性:您无法从同一会话中创建的缓存中获取实体。

非严格的读写缓存不会比较时间戳,所以这确实在第一次加载()之后实现了缓存命中。

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

答案 1 :(得分:2)

正如JavaDoc所说:时间戳表示实体是在事务开始后创建的,因此事务无法看到它(根据ACID)。

所以看起来你有几个交易,比如A和B.你开始B,然后A,然后A创建实例X,然后B尝试查找X - >缓存未命中,因为A尚未提交,但(例如)。