#java #hibernate #jfr
Вопрос:
У меня есть пакетное приложение Spring, упакованное в виде файла JAR, как показано ниже
java -Xms2048m -Xmx2048m -Ddivision=25 -Ddate= -Denv=dv -Dconn=45 -демонстрационные задания jar*.jar job-definition.xml Имя работы-следующая
Я хочу оптимизировать общее время выполнения, поэтому я пытаюсь отследить среднее время выполнения для всех методов. Я использую бортовой самописец Java.
Я вижу, что следующие методы гибернации требуют высокого процента выполнения
- Орг.спящий режим.запрос.Запрос.getResultList()
- Орг.спящий режим.запрос.внутренний.AbstractProducedQuery.list()
- Орг.спящий режим.запрос.SessionImpl.executeUpdate(Строка, параметры запроса)
Что это значит? Как мне это оптимизировать?
Комментарии:
1. Сначала вам нужно выяснить, действительно ли это проблема, учитывая, что эти методы, вероятно, взаимодействуют с внешней и удаленной системой (т. Е. базой данных), Вполне вероятно, что они тратят значительное время на ожидание ответа (в зависимости от времени обхода сети, пропускной способности сети, времени обработки в СУБД и т. Д.). Там могут быть недостатки, но это вполне может быть нормальным и ожидаемым.
Ответ №1:
Это означает, что на выполнение SQL-запросов тратится много времени, что часто бывает в типичном приложении CRUD.
Query.getResultList()
относится к select
запросам и SessionImpl.executeUpdate()
относится к update
delete
запросам или.
Чтобы понять, что происходит, вам нужно будет найти, какие запросы выполняются. Есть много способов сделать это, но мои два любимых:
- Вы можете регистрировать операторы SQL в режиме гибернации, это приведет к созданию журнала для каждого выполняемого запроса. В зависимости от вашего приложения это может регистрировать множество запросов, возможно, слишком много, чтобы быть полезным.
- Вы можете использовать профилировщик, такой как YourKit (коммерческий продукт, но у него 15-дневная пробная версия, которой должно быть достаточно для вашей проблемы). В дополнение к анализу процессора/памяти, YourKit также может отслеживать запросы, выполняемые через JDBC. В нем в основном будут перечислены все выполненные запросы, сколько раз каждый из них был выполнен и какой метод их выполнил.
Как только вы получите подробную информацию обо всех выполненных SQL-запросах, вам нужно будет проверить, соответствует ли это тому, что должно делать ваше приложение.
Проблемы, которые могут возникнуть:
- N 1 запросов
- Отсутствующий индекс столбцов, используемых в
where
предложениях(обратите внимание, что внешние ключи не индексируются автоматически в некоторых базах данных) - Процесс, который извлекает данные из некоторой таблицы конфигурации в цикле, вместо того, чтобы извлекать данные один раз в начале
- …