我在高流量网站上使用Hibernate 3.6.8,ehcache 2.4.5(也尝试过最新的2.8.0),jvm 1.6.0_22,有时我会体验
ObjectNotFoundException:不存在具有给定标识符的行:[com.example.Foo#123]`
Foo
通过最简单的代码创建一个新的(在这种情况下为id 123):
Foo foo = new Foo(); session.save(foo);
原因是在这个高流量网站的所有页面中,我得到Foo
的是这样的:
session.createQuery("from Foo").setCacheable(true).list();
存储Foo
s 的表包含1000行,实体缓存在ehcache中:
我的Hibernate配置的其他可能相关的部分是:
jdbc:mysql://localhost:3306/example?characterEncoding=UTF-8 com.mysql.jdbc.Driver org.hibernate.connection.C3P0ConnectionProvider 1 60 10 20 0 0 1 1 true true org.hibernate.transaction.JDBCTransactionFactory thread true net.sf.ehcache.hibernate.SingletonEhCacheProvider /ehcache.xml true
错误发生一次然后消失.我怀疑ehcache查询缓存是使用新的实体id(123)id更新的,但实体缓存尚未使用该实体的内容进行更新.我使用JMeter在本地轻松地重现了这一点.
关于如何解决这个问题的任何想法?
在Foo
创作时,ObjectNotFoundException
抛出一次.另一方面,如果我删除了一个实例,Foo
那么我经常(并且永远)得到ObjectNotFoundException
每次执行.list()
.堆栈跟踪可以在http://pastebin.com/raw.php?i=dp3HBgDB上看到