Вопрос

Я использую 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)

Это основано на моем понимании документация.

Приложение успешно развертывается без страшных сообщений (например, предупреждающие или сообщения об ошибках в потоке журнала). За короткий промежуток времени я вижу кэширование работы (я использую статистику Hibernate, чтобы увидеть это), но через некоторое время я получаю стеки следы формы (даже при регистрации в качестве одного пользователя без удаленного доступа:

«Транзакция попыталась создать MyClass Alew. Он уже был создан, поскольку эта транзакция началась, по другой (возможно, удаленной) транзакции. У нас есть параллельное создание события»

Следуя гигантской трассировкой стека, который в конечном итоге обратно обратно к названному запросу, которое я сделал, который я сделал, который имеет следующую форму:

SELECT x FROM X WHERE x.deleted = false

Именованный запрос не имеет дополнительных аннотаций для кэширования.

Любые советы о том, как решить эту проблему были бы очень оценены.

Это было полезно?

Решение

В первую очередь вопросы:

  1. Это исключение распространяется на ваше приложение? Я имею в виду, вы затронуты этим, или вы просто обеспокоены сообщением в журнале?
  2. Все ли ваши организации, аннотированные с транзакционной стратегией, или только несколько из них?
  3. Ваш запрос извлекает с нетерпением привлеченные объекты другого класса?

Я бы сказал, что лучшее, что вы можете сделать сейчас, состоит в том, чтобы включить отладку (или, возможно, даже трассировку) регистрацию для операций кэша: log4j.logger.org.hibernate.cache=debug Это скажет вам, что делает Hibernate. я подозревать Этот гибернат пытается поставить объект в кеш, и делать это снова, как только он видит тот же объект во время того же сеанса (может быть, как часть дерева другого объекта). Возникла проблема временной темы для запроса кэша запроса некоторое время назад, и ту же проблема может произойти здесь. Например:

Объект a # 1 - объект b # 1 объект a # 2 - объект b # 1

Но опять же, немного сложно предсказать, что решение, не зная, в чем проблема. И я боюсь, что только бревно Hibernate может сказать вам, какова проблема проблема.

PS: Это должно было быть опубликовано как комментарий, но это было слишком много времени для этого.

Другие советы

Вы пробовали CACHECONCURRENCYSTATEGY.NOSTRICT_READ_WRITE? Я прочитал документы много раз и не знаю именно то, что выбрать, но, кажется, работает нормально для моих проектов. Я предполагаю, что CACHECONCURRENCESTRATEGY.Transactional слишком сильно безопасен и избегает производительности кэша в определенных обстоятельствах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top