Событие одновременного создания - PullRequest
0 голосов
/ 06 января 2011

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

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

Будем весьма благодарны за любые советы о том, как решить эту проблему.

Ответы [ 2 ]

1 голос
/ 06 января 2011

Сначала несколько вопросов:

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

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

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

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

PS: это было предназначено для публикации в качестве комментария, но это было слишком долго для него.

0 голосов
/ 06 января 2011

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

...