Я использую JBoss 5.1.0 GA вместе с Hibernate и сейчас пытаюсь включить кэш второго уровня.Я добавил следующие свойства в свою конфигурацию Hibernate.
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />
И я аннотировал сущности, которые, как я ожидаю, меняются редко, следующим образом:
@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)
Это основано намое понимание документации .
Приложение успешно развертывается без каких-либо страшных сообщений (например, сообщений WARN или ERROR в потоке журнала).В течение короткого промежутка времени я вижу, что кеширование работает (я использую статистику Hibernate, чтобы увидеть это), но через некоторое время я получаю следы стека формы (даже когда вошел в систему как один пользователь без какого-либо удаленного доступа):
"Транзакция попыталась создать MYCLASS заново. Она уже была создана с момента запуска этой транзакции другой (возможно, удаленной) транзакцией. У нас есть параллельное событие создания"
Следуя гигантской трассировке стека, которая в конечном счете возвращает меня к выполненному именованному запросу, который имеет следующую форму:
SELECT x FROM X WHERE x.deleted = false
В именованном запросе нет дополнительных аннотаций для кэширования.
Будем весьма благодарны за любые советы о том, как решить эту проблему.