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

Сканер времени выполнения оптимизатора Гиперсуществования

Оптимизатор сохраняемости Hy 2 представляет сканер времени выполнения, который предоставляет советы по настройке производительности для JPQL, API критериев или собственных запросов SQL.

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

Вступление

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

Наряду со сканерами отображения и конфигурации JPA и Hibernate сканер времени выполнения делает оптимизатор гипердистанций незаменимым инструментом для создания высокопроизводительных приложений с сохраняемостью Java.

Украшение блока сохранения

Чтобы иметь возможность перехватывать операции JPA EntityManager и гибернации Сеанса доступа к данным, Блок сохранения (например, EntityManagerFactory или SessionFactory ) должен быть оснащен возможностями сканирования во время выполнения.

Руководство пользователя содержит пошаговые инструкции и ссылки на существующие демонстрационные приложения на GitHub , которые помогут вам настроить новый сканер времени выполнения в кратчайшие сроки.

Внедрение сканера времени выполнения потребовало большой работы, но я рад, что мне удалось предоставить вам эту потрясающую функциональность.

Объем работы, необходимый для добавления поддержки сканирования во время выполнения в @Hypersistence Оптимизатор. С нетерпением ждем завершения оставшихся элементов, запланированных к выпуску 2.0. Следите за обновлениями! https://t.co/q9TnXs1H1p pic.twitter.com/pryZ71hZpx

Перехват запросов

Сканер времени выполнения способен перехватывать любой тип выполняемых вами запросов, от JPQL до API критериев, устаревших критериев и собственных SQL-запросов.

Например, при выполнении следующего JPQL-запроса:

List posts = entityManager
.createQuery(
    "select p " +
    "from Post p ", Post.class)
.setMaxResults(5)
.getResultList();

Оптимизатор сохраняемости Hy создаст следующее событие:

ERROR [main]: Hypersistence Optimizer - CRITICAL - PaginationWithoutOrderByEvent - 
The [select p from Post p ] query uses pagination without an ORDER BY clause. 

Therefore, the result is not deterministic since SQL does not guarantee 
any particular ordering unless an ORDER BY clause is being used. 

Мы забыли добавить предложение ORDER BY, и по этой причине результирующий набор смещения по страницам не будет детерминированным.

Или при выполнении следующих критериев API:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery criteria = builder.createQuery(Post.class);
Root post = criteria.from(Post.class);
post.fetch("comments");

criteria.select(post).distinct(true);

List posts = entityManager
.createQuery(criteria)
.getResultList();

Оптимизатор гиперсистенции обнаружит, что вы забыли указать подсказку запроса PASS_DISTINCT_THROUGH:

ERROR [main]: Hypersistence Optimizer - CRITICAL - PassDistinctThroughEvent - 
The [
  select distinct p 
  from Post as p 
  inner join fetch p.comments as pc
] 
query uses DISTINCT to deduplicate the returned entities. 

However, without setting the [hibernate.query.passDistinctThrough] 
JPA query hint to [false], the underlying SQL statement 
will also contain DISTINCT, which will incur extra sorting and 
duplication removal execution stages. 

Анализ контекста сохранения

Как я объяснил в этой статье , при начальной загрузке Hibernate изначально, как в случае использования Spring SessionFactoryBean , Hibernate Сессия не сбрасывается автоматически перед выполнением собственного SQL-запроса.

Итак, при подсчете записей post таблицы со следующим SQL-запросом мы видим, что значение post Count будет 0 .

Post post = new Post();
post.setTitle("High-Performance Java Persistence");

entityManager.persist(post);
 
int postCount = (
    (Number) session
    .createSQLQuery(
        "SELECT count(*) " +
        "FROM post ")
    .uniqueResult()
)
.intValue();

assertEquals(0, postCount);

Оптимизатор гиперсистенции вызовет следующее событие при выполнении вышеуказанного запроса:

ERROR [main]: Hypersistence Optimizer - CRITICAL - FlushModeAutoEvent - 

The Hibernate Session uses the legacy [FlushMode.AUTO] strategy, 
that does not guarantee read-your-writes consistency for native SQL queries. 

When using the default [FlushMode.AUTO], Hibernate does not flush 
the Persistence Context prior to executing an SQL query, 
so the pending entity changes will not be visible to the query execution. 

Consider setting the current Session or Query [flushMode] property 
to the value of [ALWAYS], or add the [org.hibernate.flushMode]
 Hibernate configuration setting with the value of [always].

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

Упрощение поиска событий

Ранее, чтобы получить список Событий объектов, которые были вызваны оптимизатором гиперсуществования, вам нужно было предоставить ListEventHandler . Начиная с версии 2.0, вы можете извлекать все события, подобные этому:

List events = hypersistenceOptimizer.getEvents();

Включение и отключение сканеров

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

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

Документация в формате HTML и PDF

Пакет сборки, который вы загружаете из репозитория product , содержит Руководства по установке и руководству пользователя в форматах HTML и PDF.

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

Вывод

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

Наслаждайтесь запуском приложения базы данных Java на высокой скорости и следите за обновлениями для получения дополнительной информации!