Я использую 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
содержит 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
, тогда я постоянно (и навсегда) получаю ObjectNotFoundException
для каждого выполнения .list()
. Стекту можно увидеть на http://pastebin.com/raw.php?i=dp3HBgDB