Я использую Hibernate 3.6.8, ehcache 2.4.5 (также пробовал с последними 2,8.0), jvm 1.6.0_22 на сайте с высоким трафиком, а иногда я испытываюМногие одновременные чтения + одна причина записи ObjectNotFoundException из-за ehcache
ObjectNotFoundException: ни в одной строке с данным идентификатором не существует: [com.example.Foo # 123] `
, когда новый Foo
(в данном случае с идентификатором 123) создается с помощью простейшего кода возможного :
Foo foo = new Foo();
session.save(foo);
Причина заключается в том, что во всех страницах этого высокого трафику я получаю все Foo
сек, как это:
session.createQuery("from Foo").setCacheable(true).list();
Таблица хранения Foo
S содержит 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()
. StackTrace можно увидеть на http://pastebin.com/raw.php?i=dp3HBgDB
могли бы вы опубликовать свой файл ehcache.xml –
@AshishJagtap: http://pastebin.com/raw.php?i=LdgWiLE0 – cherouvim
И вы подтвердили, что исключение на самом деле выбрасывается при обращении к кэш-памяти, а не БД ? Возможно, косвенно через сквозной кеш? – Ralf