2013-03-12 2 views
4

Мне было интересно, если бы был способ сообщить Hibernate генерировать какое-то консольное предупреждение, когда в кеше сеанса слишком много объектов определенного типа. Я хотел бы сделать это для тестирования нагрузки, так как у нас есть проблемы с загрузкой BLOB из Oracle.Предупреждения, когда объекты не ленивы загружены в спящий режим

Пока мы используем Hibernate 3.6.10. Наш лучший подход к этому тестированию на данный момент состоит в том, чтобы просто генерировать больше данных, чем система могла бы обрабатывать в обычном случае использования и пытаться загрузить родительский объект и посмотреть, не сработает ли он. Делать это так просто чувствует себя плохо.

Любые предложения приветствуются.

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

- EDIT -

Вот пример того, что я пытаюсь сделать:

Скажем, у меня есть @Entity ClassX, который имеет ленивую загруженный список @Entity ClassY объектов. Некоторые, как, я хотел бы, чтобы сообщение журнала выплевывалось, когда в кеш сеанса загружено 100 или более экземпляров ClassY. Таким образом, во время разработки я могу загрузить объект ClassX и заметить, что если я (или другой разработчик в команде) получаю доступ к этому списку, когда мне этого не должно быть.

+0

Являются ли эти объекты сущностями или компонентами? (Это касается записей в кеше сеанса или отдельных полей этих записей?) – meriton

+0

Я говорю в основном о самих сущностях, но способность отслеживать компоненты также может быть приятной. Я попытаюсь обновить свой вопрос на примере. – Andy

ответ

1

Вы можете прикрепить Interceptor, чтобы прослушивать события загрузки объекта, поддерживая подсчет для каждого уникального типа сущности и регистрируя предупреждение всякий раз, когда он проходит определенный порог. The documentation показывает, как определить контекст сеанса перехватчик, путем передачи его в во время создания:

Session session = sf.openSession(new AuditInterceptor()); 

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

Легче объявить перехватчик SessionFactory, но он, похоже, не дает вам никаких ссылок на сеанс, что объект создается внутри, в противном случае вы сможете сбить какой-то счетчик в a WeakHashMap (с сессией в качестве ключа, чтобы вы не просачивали память). Если вы используете стратегию локального сеанса по умолчанию, вы всегда можете задать sessionFactory.getCurrentSession().

+0

Это превосходно - на самом деле, возможно, именно то, что я хотел. Мы сделаем это, когда у нас будет еще немного времени. Для справки мы используем Spring для создания сеансов и, скорее всего, просто вводим перехватчик. – Andy

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