HIBERNATE. Содержимое кэша сессии (first-level persistence context cache)

У каждой сессии HIBERNATE имеется свой КЭШ первого уровня или по-другому контекст персистности. Этот кэш предназначен для отслеживания изменения состояния персистных объектов (entity и collections), с тем чтобы в нужный момент автоматически перенести эти изменения в БД.

Впрочем, для сессий типа StatelessSession персистность не поддерживается и поэтому у такой сессии кэша первого уровня нет.

Объект становится персистным автоматически при использовании методов HIBERNATE по загрузке объектов, таких как find(), getReference(), Query.getResultList(), Query.getSingleResult(). Или персистным можно сделать объект, с помощью метода persist(). Когда объект становится персистным, то он присоединяется к КЭШ первого уровня.

Персистный объект может быть отсоединен от кэша и тогда он перестает быть персистным. Это может быть сделано с помощью методов detach(), close(), clear() и других.

В HIBERNATE есть некоторые утилиты для просмотра содержимого кэша. Прежде всего это интерфейс SessionStatistics. В этом интерфейсе предусмотрены следующие функции:

  • getEntityCount() – возвращает количество entity в кэше
  • getCollectionCount() – возвращает количество коллекций в кэше
  • getEntityKeys() – Set объектов, в которых информация о ID entity
  • getCollectionKeys() – Set объектов, в которых информация о ID entity, которой принадлежит коллекция.

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

Для просмотра содержимого кэша сессии можно ограничится сведениями о количестве entity и коллекций.

Для более развернутой информации о количестве entity и коллекций каждого класса и о значениях ID entity можно использовать прилагаемую здесь утилиту showSessionCashe8 (фактически метод).

 

Для использования данной утилиты необходима java8.

Метод выводит информацию на консоль. Вывод производится в самом конце метода и метод легко переписать под вывод в лог или под текстовой возврат метода.

Метод принимает на входе объект сессии HIBERNATE — Session session и параметр int maxCountID.

Последний параметр определяет объем выводимой информации. Если передать отрицательное число, то выводится только количество персистных entity и коллекций в кэш сессии. Если передать ноль, то будет выведена информация о количестве entity и коллекций в разрезе классов. Если передать положительное число, то будyт перечислены ID (с пометкой <r> для entity, помеченных на удаление) для каждого класса entity (но не более maxCountID ID). Кроме того, будет выведена информация о принадлежности коллекции к конкретному entity, с указанием реальной загруженности данных коллекции.

 

 

 

Добавить комментарий