我有一个长期运行的 EntityManager,我会定期清除它。我在我的一个实体上配置了读写缓存。
我做了一些调查,我可以看到该实体存在于缓存中。我什至可以看到来自 net.sf.ehcache.Cache.searchInStoreWithStats() 的缓存命中。但是,如果实体的时间戳晚于 session 创建时的时间戳,ehcache 将不会返回该实体:请参阅 AbstractReadWriteEhcacheAccessStrategy.get(Object, long) .
这种行为的原因是什么?有没有办法可以自定义 hibernate 或 ehcache 以在单个 EntityManager 中实现缓存命中?
最佳答案
看起来这是读写缓存的属性:您无法从同一 session 中创建的缓存中获取实体。
非严格读写缓存不比较时间戳,因此这确实在第一次 load() 后实现了缓存命中。
更好的是,事务缓存在 persist() 之后填充缓存,因此第一次 load() 将导致缓存命中。由于我与数据库的交互完全在单个 JVM 中的单个线程内进行,因此我相信这是可以安全使用的。
关于java - 为什么hibernate/ehcache二级缓存在同一个 session 中总是丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305941/