Автор оригинала: 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-запроса:
Listposts = 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(); CriteriaQuerycriteria = 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, вы можете извлекать все события, подобные этому:
Listevents = hypersistenceOptimizer.getEvents();
Включение и отключение сканеров
Теперь вы можете включить или отключить сканер отображения, конфигурации и времени выполнения из JpaConfig
и Конфигурации гибернации
экземпляров, которые вы передаете в конструктор HypersistenceOptimizer
.
Этот механизм даст вам лучший контроль над тем, что необходимо сканировать, когда вы не можете использовать одноэлементный Гиперсистенционный оптимизатор
экземпляр для всех интеграционных тестов.
Документация в формате HTML и PDF
Пакет сборки, который вы загружаете из репозитория product , содержит Руководства по установке и руководству пользователя в форматах HTML и PDF.
Это позволит вам прочитать документацию, когда вы находитесь в автономном режиме, или распечатать список поддерживаемых событий, что само по себе является очень ценным ресурсом.
Вывод
Версия 2.0-это только начало. Я с нетерпением жду возможности добавить поддержку для обнаружения медленных запросов, запросов, которые извлекают слишком много данных, экземпляра контекста сохранения, извлекающего сущности в режиме чтения-записи без применения каких-либо изменений.
Наслаждайтесь запуском приложения базы данных Java на высокой скорости и следите за обновлениями для получения дополнительной информации!