我使用 Hibernate 3.6.8,ehcache 2.4.5(也尝试了最新的 2.8.0 版本),jvm 1.6.0_22 在一个高流量站点上,有时我会遇到
ObjectNotFoundException: No row with the given identifier exists: [com.example.Foo#123]`
当通过最简单的代码创建一个新的 Foo
(在本例中为 id 123)时。
Foo foo = new Foo();
session.save(foo);
这个高流量网站的所有页面中,我获取到的所有Foo
都是这样的原因:
在该高流量网站的所有页面中,我以以下方式获取所有的Foo
:
session.createQuery("from Foo").setCacheable(true).list();
存储Foo
的表格包含1000行,实体存储在ehcache缓存中:
<class-cache class="com.example.Foo" usage="read-write" />
我Hibernate配置中可能相关的其他部分包括:
<property name="connection.url">jdbc:mysql://localhost:3306/example?characterEncoding=UTF-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">60</property>
<property name="hibernate.c3p0.min_size">10</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="hibernate.c3p0.acquireRetryAttempts">1</property>
<property name="hibernate.c3p0.acquireRetryDelay">1</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.jdbc.use_scrollable_resultset">true</property>
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</property>
<property name="net.sf.ehcache.configurationResourceName">/ehcache.xml</property>
<property name="hibernate.cache.use_query_cache">true</property>
这个错误会出现一次,然后就消失了。我怀疑ehcache查询缓存已经使用新实体ID(123)更新,但实体缓存还没有更新该实体的内容。我使用JMeter在本地很容易复制这个问题。
有任何解决这个问题的想法吗?
在创建Foo
时,会抛出 ObjectNotFoundException
错误一次。另外,如果我删除一个Foo
实例,则每次执行.list()
时都会不断地(永久)获得ObjectNotFoundException
。可以在http://pastebin.com/raw.php?i=dp3HBgDB看到堆栈跟踪。
Foo
有任何外键关系吗? - DurandalFoo
表中有外键,但不一定与我创建或删除以重现问题的条目相关。 - cherouvim