Как оптимизировать время выполнения спящего режима?

#java #hibernate #jfr

Вопрос:

У меня есть пакетное приложение Spring, упакованное в виде файла JAR, как показано ниже

java -Xms2048m -Xmx2048m -Ddivision=25 -Ddate= -Denv=dv -Dconn=45 -демонстрационные задания jar*.jar job-definition.xml Имя работы-следующая

Я хочу оптимизировать общее время выполнения, поэтому я пытаюсь отследить среднее время выполнения для всех методов. Я использую бортовой самописец Java.

Я вижу, что следующие методы гибернации требуют высокого процента выполнения

  1. Орг.спящий режим.запрос.Запрос.getResultList()
  2. Орг.спящий режим.запрос.внутренний.AbstractProducedQuery.list()
  3. Орг.спящий режим.запрос.SessionImpl.executeUpdate(Строка, параметры запроса)

введите описание изображения здесь

введите описание изображения здесь

Что это значит? Как мне это оптимизировать?

Комментарии:

1. Сначала вам нужно выяснить, действительно ли это проблема, учитывая, что эти методы, вероятно, взаимодействуют с внешней и удаленной системой (т. Е. базой данных), Вполне вероятно, что они тратят значительное время на ожидание ответа (в зависимости от времени обхода сети, пропускной способности сети, времени обработки в СУБД и т. Д.). Там могут быть недостатки, но это вполне может быть нормальным и ожидаемым.

Ответ №1:

Это означает, что на выполнение SQL-запросов тратится много времени, что часто бывает в типичном приложении CRUD.

Query.getResultList() относится к select запросам и SessionImpl.executeUpdate() относится к update delete запросам или.

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

  • Вы можете регистрировать операторы SQL в режиме гибернации, это приведет к созданию журнала для каждого выполняемого запроса. В зависимости от вашего приложения это может регистрировать множество запросов, возможно, слишком много, чтобы быть полезным.
  • Вы можете использовать профилировщик, такой как YourKit (коммерческий продукт, но у него 15-дневная пробная версия, которой должно быть достаточно для вашей проблемы). В дополнение к анализу процессора/памяти, YourKit также может отслеживать запросы, выполняемые через JDBC. В нем в основном будут перечислены все выполненные запросы, сколько раз каждый из них был выполнен и какой метод их выполнил.

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

Проблемы, которые могут возникнуть:

  • N 1 запросов
  • Отсутствующий индекс столбцов, используемых в where предложениях(обратите внимание, что внешние ключи не индексируются автоматически в некоторых базах данных)
  • Процесс, который извлекает данные из некоторой таблицы конфигурации в цикле, вместо того, чтобы извлекать данные один раз в начале