Несколько экземпляров Hibernate envers FirstLevelCache

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

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

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

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

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

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

  1. Я не использую правильный метод для получения читателя аудита контекста сеанса
  2. Есть веская причина для наличия нескольких экземпляров программы чтения аудита
  3. Где-то в недрах энверса есть баг
  4. Повторное использование экземпляров программы чтения аудита не имеет смысла.

Может кто-нибудь дать некоторое представление об этом.

Спасибо.


person subie    schedule 23.09.2013    source источник
comment
как сеанс привязан к потоку и как вы читаете из него ... я знаю, что это простая задача, но там возникают большие проблемы ... другими словами, пожалуйста, поделитесь кодом, о котором идет речь.   -  person Anantha Sharma    schedule 23.09.2013
comment
@AnanthaSharma У меня есть единственный статический экземпляр SessionFactory, и я использую final Session session = sessionFactory.getCurrentSession() для получения текущего сеанса контекста Hibernate.   -  person subie    schedule 23.09.2013
comment
как вы привязываете сеанс к потоку и получаете к нему доступ ... там что-то не так ...   -  person Anantha Sharma    schedule 23.09.2013
comment
Привет, @AnanthaSharma, я не понимаю, что ты имеешь в виду. Я выхожу из Hibernate, чтобы управлять контекстами сеанса. Я просто назначаю управление контекстом потока, устанавливая для свойства конфигурации hibernate.current_session_context_class значение thread   -  person subie    schedule 23.09.2013


Ответы (1)


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

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

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

person adamw    schedule 24.09.2013
comment
Спасибо @adamw, я учту это. Фактически, если подумать об этом больше, кеш первого уровня исторических сущностей сильно отличается от кеша первого уровня текущих сущностей, поскольку исторические сущности неизменны. Следовательно, для исторических объектов можно рассмотреть возможность использования единого кэша, независимо от сеанса, что потребует стратегии устаревания. Учитывая это, вероятно, намного проще придерживаться текущей стратегии :) - person subie; 24.09.2013