2013-09-23 6 views
1

Я отлаживал некоторое странное поведение в моем коде в течение нескольких дней и наткнулся на то, что меня удивило. Я подтвердил, что это не способствует моей проблеме, но я подумал, что в любом случае стоит проверить мои предположения.Несколько Hibernate envers экземпляры FirstLevelCache

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

Я пришел к аналогичному поведению с энверсом при получении экземпляра аудиторского аудита. Я использую AuditReader reader = AuditReaderFactory.get(session);, чтобы получить AuditReader экземпляров. Я заметил, что каждый раз, когда это вызывается (даже в том же контексте сеанса), я получаю новый экземпляр аудита аудита, содержащий уникальный экземпляр кеша первого уровня.

Похоже, это приведет в лучшем случае к удару производительности нескольких, возможно перекрывающихся кешей.

Я предположил, что для контекста сеанса я всегда получал бы тот же экземпляр AuditReader и, следовательно, один кеш первого уровня. Я не могу придумать, почему это не так.

Это оставляет меня с четырьмя возможностей:

  1. Я не использую правильный метод, чтобы получить читатель ревизовать контекст сеанса в
  2. Существует хорошая причина для нескольких экземпляров читателей аудита
  3. Существует ошибка где-то в глубине envers
  4. Не имеет смысла повторно использовать экземпляры аудиторских проверок.

Может кто-то прокомментировать это.

Спасибо.

+0

Как связать сеанс с потоком и как вы его читаете ... Я знаю его простую задачу, но возникают большие проблемы ... другими словами, PLS делят код, который находится под вопросом. –

+0

@AnanthaSharma У меня есть один статический экземпляр 'SessionFactory' и используйте' final Session session = sessionFactory.getCurrentSession() 'для получения текущего сеанса контекста Hibernate. – subie

+0

как вы привязываете сессию к потоку и получаете доступ к ней .. там может быть что-то не так .. –

ответ

1

Если вы посмотрите на реализацию AuditReaderFactory (here), новый экземпляр AuditReaderImpl создается для каждого вызова; экземпляры не кэшируются в любом месте.

Он не указывается нигде, что вы должны получить тот же экземпляр, если вы даете тот же сеанс; поэтому ваш запрос можно рассматривать как «запрос функции», но я бы не сказал, что это ошибка.

Нет особых причин не повторять использование экземпляров аудиторских проверок.

+0

Спасибо @adamw Я расскажу об этом. На самом деле, думая об этом больше, кеш первого уровня исторических объектов сильно отличается от кеша первого уровня текущих объектов, поскольку исторические объекты неизменяемы.Поэтому один кеш можно рассматривать для исторических объектов независимо от сеанса, что потребует стратегии старения. Учитывая это, вероятно, гораздо проще придерживаться текущей стратегии :) – subie

Смежные вопросы