Рубрики
Без рубрики

Руководство для начинающих по статистике гибернации

Узнайте, как работает механизм статистики гибернации и как его активировать, чтобы у вас было лучшее представление о том, что происходит под капотом.

Автор оригинала: Vlad Mihalcea.

Вступление

Hibernate предоставляет очень мощный статистический механизм, который, к сожалению, менее известен. В этой статье мы рассмотрим, как работает механизм статистики гибернации и как вы можете его активировать.

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

Руководство для начинающих по статистике гибернации @vlad_mihalcea https://t.co/OdUcM0A74x https://t.co/OdUcM0A74x

Интерфейс статистики

Иерархия классов статистики гибернации выглядит следующим образом:

Режим гибернации org.hibernate.stat. Статистика интерфейс содержит исчерпывающий список показателей, которые вы можете проверить в отношении поведения текущего режима гибернации SessionFactory или JPA EntityManager .

Методы общего назначения

Следующие методы Статистика используются для описания или управления текущим объектом Hibernate Статистика .

{‘dt’: {‘code’: ‘логическое значение isStatisticsEnabled()’}}
{‘dd’: ‘Он определяет, включен ли механизм статистики гибернации или нет.’}
{‘dt’: {‘code’: ‘пустота setStatisticsEnabled(логическое значение b)’}}
{‘dd’: ‘Он включает или отключает механизм статистики гибернации.’}
{‘dt’: {‘code’: ‘пустота ясна()’}}
{‘dd’: ‘Он удаляет текущие собранные показатели.’}
{‘dt’: {‘code’: ‘долгое время начала работы ()’}}
{‘dd’: [‘Он получает отметку времени, когда то’, {‘code’: ‘Статистика’}, ‘экземпляр был создан.’]}
{‘dt’: {‘code’: ‘сводка по пустому журналу()’}}
{‘dd’: ‘Он печатает запись журнала, содержащую наиболее важные показатели.’}

EntityManager или Показатели сеанса

Следующие показатели связаны с текущим контекстом сохранения:

{‘dt’: {‘code’: ‘длинный getSessionOpenCount()’}}
{‘dd’: [‘Он обеспечивает количество’, {‘code’: ‘Сессия’}, ‘или’, {‘code’: ‘EntityManager’}, ‘экземпляры, которые были открыты текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать SessionCloseCount()’}}
{‘dd’: [‘Он обеспечивает количество’, {‘code’: ‘Сессия’}, ‘или’, {‘code’: ‘EntityManager’}, ‘экземпляры, которые были закрыты текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘длинный getFlushCount()’}}
{‘dd’: [‘Это обеспечивает количество раз то’, {‘code’: ‘Сессия’}, ‘или’, {‘code’: ‘EntityManager’}, ‘экземпляры были сброшены.’]}

Показатели базы данных

Следующие показатели связаны либо с подключением к базе данных, транзакцией, либо с выполнением инструкций:

{‘dt’: {‘code’: ‘длинный getConnectCount()’}}
{‘dd’: [‘Он показывает количество подключений к базе данных, которые были получены текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать SuccessfulTransactionCount()’}}
{‘dd’: [‘В нем указывается количество транзакций, совершенных текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘длинный getTransactionCount()’}}
{‘dd’: [‘Он показывает количество транзакций, которые были выполнены текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать PrepareStatementCount()’}}
{‘dd’: [‘Он предоставляет номер JDBC’, {‘code’: ‘Подготовленные Заявления’}, ‘которые были созданы текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать CloseStatementCount()’}}
{‘dd’: [‘В нем указано количество экземпляров инструкции JDBC, которые были закрыты текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}

Показатели сущности

Следующие показатели связаны с объектами JPA или Hibernate:

{‘dt’: {‘code’: ‘Строка[] getentityname()’}}
{‘dd’: [‘В нем указаны имена всех юридических лиц, зарегистрированных в текущем’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘Статистика сущностей getEntityStatistics(Строковое имя сущности)’}}
{‘dd’: [‘Это обеспечивает вам’, {‘code’: ‘Статистика объектов’}, ‘объект для указанного имени сущности.’]}
{‘dt’: {‘code’: ‘длинный getEntityLoadCount()’}}
{‘dd’: [‘Это дает вам общее количество объектов, которые были загружены (включая объект, извлеченный из кэша первого или второго уровня или базы данных) текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘длинный getEntityFetchCount()’}}
{‘dd’: [‘Это дает вам общее количество сущностей, которые были извлечены из базы данных текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘длинный getEntityInsertCount()’}}
{‘dd’: [‘Это дает вам общее количество объектов, которые были вставлены текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘длинный getEntityUpdateCount()’}}
{‘dd’: [‘Это дает вам общее количество сущностей, которые были обновлены текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘длинный getEntityDeleteCount()’}}
{‘dd’: [‘Это дает вам общее количество объектов, которые были удалены текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}

Показатели сбора

Следующие показатели связаны с коллекциями сущностей JPA или Hibernate:

{‘dt’: {‘code’: ‘Строка[] getCollectionRoleNames()’}}
{‘dd’: [‘В нем содержатся имена всех коллекций сущностей, зарегистрированных в текущем’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘Статистика сбора getCollectionСтатистика(роль строки)’}}
{‘dd’: [‘Это обеспечивает вам’, {‘code’: ‘Статистика сбора’}, ‘объект для предоставленного имени коллекции сущностей.’]}
{‘dt’: {‘code’: ‘длинный getCollectionLoadCount()’}}
{‘dd’: [‘Это дает вам общее количество загруженных коллекций (включая ту, которая была получена из кэша первого или второго уровня или базы данных) текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘длинный getCollectionFetchCount()’}}
{‘dd’: [‘Это дает вам общее количество коллекций, которые были извлечены из базы данных текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать CollectionUpdateCount()’}}
{‘dd’: [‘Это дает вам общее количество коллекций, которые были обновлены текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать CollectionRemoveCount()’}}
{‘dd’: [‘Это дает вам общее количество коллекций, которые были удалены текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать CollectionRecreateCount()’}}
{‘dd’: [‘Это дает вам общее количество коллекций, которые были воссозданы текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}

Метрики запросов

Следующие показатели связаны с запросами, которые были выполнены текущим JPA EntityManagerFactory или Hibernate SessionFactory :

{‘dt’: {‘code’: ‘Строка[] getQueries()’}}
{‘dd’: [‘Он возвращает запросы сущностей (например, HQL и API критериев), выполняемые текущим JPA’, {‘code’: ‘EntityManagerFactory’}, ‘или Зимовать’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘Статистика запросов getQueryStatistics(Строка запроса)’}}
{‘dd’: [‘Он возвращает’, {‘code’: ‘Статистика запросов’}, ‘связано с предоставленным запросом.’]}
{‘dt’: {‘code’: ‘длинный getQueryExecutionCount()’}}
{‘dd’: [‘Он показывает количество запросов, которые были выполнены текущим JPA’, {‘code’: ‘EntityManagerFactory’}, ‘или Зимовать’, {‘code’: ‘SessionFactory’}, ‘.’]}
{‘dt’: {‘code’: ‘долго получать QueryExecutionMaxTime()’}}
{‘dd’: ‘Это дает максимальное время выполнения всех запросов, которые были выполнены.’}
{‘dt’: {‘code’: ‘Строка получить строку запроса QueryExecutionMaxTime()’}}
{‘dd’: ‘В нем указывается имя запроса с наибольшим временем выполнения.’}
{‘dt’: {‘code’: ‘длинный getQueryPlanCacheHitCount()’}}
{‘dd’: [‘Он обеспечивает количество попаданий для’, ‘Кэш Плана запроса’, ‘.’]}
{‘dt’: {‘code’: ‘длинный getQueryPlan CacheMissCount()’}}
{‘dd’: [‘Это обеспечивает подсчет промахов для’, ‘Кэш Плана запроса’, ‘.’]}

Показатели естественного идентификатора

Следующие показатели связаны с механизмом естественного идентификатора Hibernate:

{‘dt’: {‘code’: ‘Статистика естественных идентификаторов getNaturalIdStatistics(Имя объекта строки)’}}
{‘dd’: [‘Он возвращает’, {‘code’: ‘Статистика Естественных Идентификаторов’}, ‘связано с предоставленным именем сущности.’]}
{‘dt’: {‘code’: ‘длинный getNaturalIdQueryExecutionCount()’}}
{‘dd’: ‘Он показывает, сколько раз данный идентификатор сущности был разрешен с помощью связанного с ним естественного идентификатора.’}
{‘dt’: {‘code’: ‘долгое getNaturalIdQueryExecutionMaxTime()’}}
{‘dd’: ‘Это дает максимальное время выполнения, в течение которого данный идентификатор сущности был разрешен с помощью связанного с ним естественного идентификатора.’}
{‘dt’: {‘code’: ‘Строка getNaturalIdQueryExecutionMaxTimeRegion()’}}
{‘dd’: ‘Он дает имя области кэша второго уровня с самым длинным запросом разрешения естественного идентификатора.’}
{‘dt’: {‘code’: ‘Строка getNaturalIdQueryExecutionMaxTimeEntity()’}}
{‘dd’: ‘В нем указывается имя сущности, для которой был записан самый длинный запрос на разрешение естественного идентификатора.’}

Показатели кэша второго уровня

Следующие показатели связаны с механизмом кэширования второго уровня:

{‘dt’: {‘code’: ‘Строка[] getSecondLevelCacheRegionNames()’}}
{‘dd’: ‘Он предоставляет имена всех регионов, используемых кэшем второго уровня.’}
{‘dt’: {‘code’: ‘Статистика региона кэша getDomainDataRegionStatistics(Строковое имя региона)’}}
{‘dd’: [‘Это обеспечивает’, {‘code’: ‘Статистика региона Кэша’}, ‘связано с именем данного региона.’]}
{‘dt’: {‘code’: ‘Статистика региона кэша Статистика региона getQuery(Строковое Имя региона)’}}
{‘dd’: [‘Он предоставляет запрос’, {‘code’: ‘Статистика региона Кэша’}, ‘связано с именем данного региона.’]}
{‘dt’: {‘code’: ‘Статистика региона кэша Статистика региона кэша getCache(Строковое Имя региона)’}}
{‘dd’: [‘Он предоставляет данные домена или запрос’, {‘code’: ‘Статистика региона Кэша’}, ‘связано с именем данного региона.’]}
{‘dt’: {‘code’: ‘длинный getSecondLevelCacheHitCount()’}}
{‘dd’: ‘Он обеспечивает глобальное количество обращений ко всем областям кэша сущностей или коллекций.’}
{‘dt’: {‘code’: ‘длинный getSecondLevelCacheMissCount()’}}
{‘dd’: ‘Он обеспечивает глобальное количество пропусков всех областей кэша сущностей или коллекций.’}
{‘dt’: {‘code’: ‘длинный getSecondLevelCachePutCount()’}}
{‘dd’: ‘Он обеспечивает глобальное количество размещений всех областей кэша сущностей или коллекций.’}
{‘dt’: {‘code’: ‘длинный getNaturalIdCacheHitCount()’}}
{‘dd’: ‘Он обеспечивает глобальное количество попаданий в область кэша естественных идентификаторов.’}
{‘dt’: {‘code’: ‘длинный getNaturalIdCacheMissCount()’}}
{‘dd’: ‘Он обеспечивает глобальное количество пропусков в регионе кэша естественных идентификаторов.’}
{‘dt’: {‘code’: ‘длинный getNaturalIdCachePutCount()’}}
{‘dd’: ‘Он обеспечивает глобальное количество сообщений в регионе naturalidcache.’}
{‘dt’: {‘code’: ‘длинный getQueryCacheHitCount()’}}
{‘dd’: ‘Он обеспечивает количество попаданий в область кэша запросов.’}
{‘dt’: {‘code’: ‘длинный getQueryCacheMissCount()’}}
{‘dd’: ‘Он предоставляет количество пропусков в области кэша запросов.’}
{‘dt’: {‘code’: ‘долго получать QueryCachePutCount()’}}
{‘dd’: ‘Он обеспечивает количество размещений в области кэша запросов.’}
{‘dt’: {‘code’: ‘долго получать обновление времени метки, Количество попаданий в кэш()’}}
{‘dd’: ‘Он предоставляет количество попаданий в область кэша временных меток, которая используется кэшем запросов.’}
{‘dt’: {‘code’: ‘длинный getUpdateTimestampsCacheMissCount()’}}
{‘dd’: ‘Это количество пропусков области кэша временных меток, которая используется кэшем запросов.’}
{‘dt’: {‘code’: ‘долго получать UpdateTimestampsCache Put Count()’}}
{‘dd’: ‘Он предоставляет глобальное количество размещений области кэша временных меток, которая используется кэшем запросов.’}

Показатели контроля параллелизма

{‘dt’: {‘code’: ‘долго получать OptimisticFailureCount()’}}
{‘dd’: [‘Он обеспечивает количество оптимистичных сбоев блокировки, обнаруженных текущим’, {‘code’: ‘EntityManagerFactory’}, ‘или’, {‘code’: ‘SessionFactory’}, ‘.’]}

Интерфейс StatisticsImplementor

org.hibernate.stat.spi. StatisticsImplementor интерфейс расширяет вышеупомянутое Статистика интерфейс и определяет несколько методов обратного вызова, которые выполняются API ядра Hibernate.

EntityManager или Показатели сеанса

{‘dt’: {‘code’: ‘пустая открытая сессия()’}}
{‘dd’: [‘Этот обратный вызов вызывается, когда JPA’, {‘code’: ‘EntityManager’}, ‘или зимняя спячка’, {‘code’: ‘Сессия’}, ‘создается.’]}
{‘dt’: {‘code’: ‘пустота закрывает сеанс()’}}
{‘dd’: [‘Этот обратный вызов вызывается, когда JPA’, {‘code’: ‘EntityManager’}, ‘или зимняя спячка’, {‘code’: ‘Сессия’}, ‘закрыто.’]}
{‘dt’: {‘code’: ‘сброс пустоты()’}}
{‘dd’: [‘Этот обратный вызов вызывается, когда JPA’, {‘code’: ‘EntityManager’}, ‘или зимняя спячка’, {‘code’: ‘Сессия’}, ‘покраснела.’]}

Показатели базы данных

{‘dt’: {‘code’: ‘соединение с пустотой()’}}
{‘dd’: [‘Этот обратный вызов вызывается, когда соединение с базой данных получено из в настоящее время настроен’, {‘code’: ‘Поставщик соединений’}, ‘.’]}
{‘dt’: {‘code’: ‘заявление о подготовке к аннулированию()’}}
{‘dd’: [‘Этот обратный вызов вызывается, когда a JDBC’, {‘code’: ‘Подготовленное Заявление’}, ‘экземпляр создан.’]}
{‘dt’: {‘code’: ‘пустое закрытие()’}}
{‘dd’: [‘Этот обратный вызов вызывается, когда a JDBC’, {‘code’: ‘Подготовленное Заявление’}, ‘экземпляр закрыт.’]}
{‘dt’: {‘code’: ‘недействительная конечная транзакция(логический успех)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда транзакция RESOURCE_LOCAL или JTA либо фиксируется, либо откатывается.’}

Показатели сущности

{‘dt’: {‘code’: ‘пустая загрузка(имя объекта строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда данная сущность загружается либо как прокси-сервер, либо путем ее извлечения из базы данных.’}
{‘dt’: {‘code’: ‘пустая сущность выборки(имя объекта строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда данная сущность извлекается из базы данных.’}
{‘dt’: {‘code’: ‘пустая вставка(имя объекта строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается при вставке заданного объекта.’}
{‘dt’: {‘code’: ‘недействительное значение обновления(имя объекта строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается при обновлении данной сущности.’}
{‘dt’: {‘code’: ‘недействительное удаление(имя объекта строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается при удалении данного объекта.’}

Показатели сбора

{‘dt’: {‘code’: ‘пустая коллекция загрузок(роль строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется при создании или загрузке данной коллекции сущностей.’}
{‘dt’: {‘code’: ‘пустая коллекция выборки(роль строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данная коллекция сущностей извлекается из базы данных.’}
{‘dt’: {‘code’: ‘коллекция недействительных обновлений(роль строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется при обновлении данной коллекции сущностей.’}
{‘dt’: {‘code’: ‘пустая коллекция создания(роль строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется при повторном создании данной коллекции сущностей.’}
{‘dt’: {‘code’: ‘коллекция удаления пустоты(роль строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется при удалении данной коллекции сущностей.’}

Метрики запросов

{‘dt’: {‘code’: ‘выполнен пустой запрос(строка hql, int-строки, длительное время)’}}
{‘dd’: ‘Этот обратный вызов вызывается после выполнения сущности или собственного SQL-запроса.’}
{‘dt’: {‘code’: ‘попадание в кэш пустого плана запроса(строка hql)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда план запроса сущности был загружен из кэша плана запроса.’}
{‘dt’: {‘code’: ‘Скомпилированный пустой запрос(строка hql, длинные микросекунды)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда план запроса сущности не удалось загрузить из кэша плана запроса.’}

Показатели кэша второго уровня

{‘dt’: {‘code’: ‘void EntityCache Put(Имя объекта для навигации роли, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данная сущность добавляется в кэш второго уровня.’}
{‘dt’: {‘code’: ‘попадание в кэш пустых сущностей(Имя объекта для навигации, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данная сущность загружается из кэша второго уровня.’}
{‘dt’: {‘code’: ‘пропуск кэша пустых сущностей(Имя объекта для навигации, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данная сущность не была найдена в кэше второго уровня.’}
{‘dt’: {‘code’: ‘кэш пустых коллекций Помещен(Доступная роль коллекционирования, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данная коллекция сущностей была добавлена в кэш второго уровня.’}
{‘dt’: {‘code’: ‘попадание в кэш voidcollection(Доступная роль для сбора ролей, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данная коллекция сущностей загружается из кэша второго уровня.’}
{‘dt’: {‘code’: ‘пропуск кэша сбора пустоты(Роль сбора перемещаемой роли, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данная коллекция сущностей не была найдена в кэше второго уровня.’}
{‘dt’: {‘code’: ‘void naturalIdCache Put(Имя корневой роли для навигации, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда заданный естественный идентификатор добавляется в кэш второго уровня.’}
{‘dt’: {‘code’: ‘пустое попадание в кэш naturalIdCache(Имя корневой роли для навигации, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данный идентификатор сущности разрешен с помощью связанного с ним естественного идентификатора из кэшированного второго уровня.’}
{‘dt’: {‘code’: ‘пропущен пропущенный естественный кэш(Имя корневой роли для навигации, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов выполняется, когда данный идентификатор сущности не может быть разрешен с помощью связанного с ним естественного идентификатора из кэшированного второго уровня.’}
{‘dt’: {‘code’: ‘выполняется запрос void NaturalID(имя корневой строки, длительное время выполнения)’}}
{‘dd’: ‘Этот обратный вызов вызывается после выполнения запроса идентификатора сущности по связанному естественному идентификатору.’}
{‘dt’: {‘code’: ‘пустое место в кэше запросов(Строка hql, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда запись кэша запросов хранится в области кэша запросов второго уровня.’}
{‘dt’: {‘code’: ‘попадание в кэш пустого запроса(Строка hql, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда запись кэша запросов загружается из области кэша запросов второго уровня.’}
{‘dt’: {‘code’: ‘пропуск кэша пустых запросов(Строка hql, Имя региона строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда запись кэша запросов не может быть загружена из области кэша запросов второго уровня.’}
{‘dt’: {‘code’: ‘аннулировать кэш меток времени обновления()’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда метка времени последнего обновления табличного пространства загружается из области кэша запросов с метками времени’}
{‘dt’: {‘code’: ‘пропущено время обновления меток в кэше()’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда метка времени последнего обновления табличного пространства не может быть загружена из области кэша запросов с метками времени’}
{‘dt’: {‘code’: ‘пустое значение UpdateTimestampsCache Put()’}}
{‘dd’: ‘Этот обратный вызов вызывается, когда метка времени последнего обновления табличного пространства добавляется в область кэша запросов с метками времени’}

Показатели контроля параллелизма

{‘dt’: {‘code’: ‘недействительный оптимистический сбой(имя объекта строки)’}}
{‘dd’: ‘Этот обратный вызов вызывается при возникновении оптимистичного исключения блокировки.’}

Эти обратные вызовы очень полезны, если вы хотите настроить механизм статистики гибернации.

Активация механизма статистики

По умолчанию механизм статистики отключен. Чтобы включить его, вам необходимо задать следующее свойство конфигурации:


После активации метрики сохраняются в org.hibernate.stat.internal. StatisticsImpl объект.

Чтобы просмотреть статистику, напечатанную в журнале, вам необходимо установить следующий регистратор:


После этого Hibernate напечатает следующие записи в журнале:

INFO  [Alice]: o.h.e.i.StatisticalLoggingSessionEventListener - Session Metrics {
    307100 nanoseconds spent acquiring 1 JDBC connections;
    55100 nanoseconds spent releasing 1 JDBC connections;
    13868600 nanoseconds spent preparing 3 JDBC statements;
    3504100 nanoseconds spent executing 3 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    53460600 nanoseconds spent executing 1 flushes (flushing a total of 3 entities and 2 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)

Круто, правда?

Вывод

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