我有一个长期运行的EntityManager,我定期清除()。我在我的一个实体上配置了读写缓存。
我做了一些调查,我可以看到实体存在于缓存中。我甚至可以看到来自net.sf.ehcache.Cache.searchInStoreWithStats()的缓存命中。但是,如果实体的时间戳晚于创建会话的时间戳,则ehcache将不会返回该实体:请参阅AbstractReadWriteEhcacheAccessStrategy.get(Object, long)。
这种行为的原因是什么?有没有办法可以自定义hibernate或ehcache来实现单个EntityManager中的缓存命中?
答案 0 :(得分:3)
看起来这是读写缓存的属性:您无法从同一会话中创建的缓存中获取实体。
非严格的读写缓存不会比较时间戳,所以这确实在第一次加载()之后实现了缓存命中。
更好的是,事务高速缓存在persist()之后填充高速缓存,因此第一个load()将导致高速缓存命中。由于我与数据库的交互完全在单个JVM中的单个线程内,我相信这是安全的。
答案 1 :(得分:2)
正如JavaDoc所说:时间戳表示实体是在事务开始后创建的,因此事务无法看到它(根据ACID)。
所以看起来你有几个交易,比如A和B.你开始B,然后A,然后A创建实例X,然后B尝试查找X - >缓存未命中,因为A尚未提交,但(例如)。