Микросервисная архитектура | Как использовать ссылку на журнал для отслеживания медленного SQL, выполняемого программой?

задняя часть Архитектура
Микросервисная архитектура | Как использовать ссылку на журнал для отслеживания медленного SQL, выполняемого программой?

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

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

При доступе к данным в системе узким местом системы часто является база данных, поэтому мы должны максимально сократить доступ к базе данных!

1. Предпосылки

Случалось ли вам сталкиваться с такой ситуацией, когда руководитель вдруг что-то устроил:Показатели измерения давления этих интерфейсов слишком низкие и нуждаются в соответствующей оптимизации..

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

Затем запустите Байду:Как повысить эффективность выполнения SQL?

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

Но в большинстве случаев бизнес-линия слишком длинная, чтобы ее мог выполнить один человек. Он включает в себя различные режимы стратегии и действия по мониторингу. Если вы хотите найти точку напрямую, вам все равно нужно вывести SQL, выполненный после того, как запрос инициирован, и эффективность выполнения. Эффективность здесь просто относится ко времени выполнения SQL.

Как только вы определились с целями, давайте начнем.

2. Добавьте трассировку JDBC

В продолжение темы предыдущей статьи:Как эффективно использовать отслеживание ссылок на журналы для анализа производительности?

▐ Формула времени выполнения SQL

Чтобы справиться с такими проблемами, первый анализ, как разделить расчет времени выполнения SQL? Процесс выполнения оператора SQL примерно такой, как показано на следующем рисунке.

Если вы хотите подсчитать время выполнения SQL. Итак, для программы можно получить грубую формулу

SQL执行时间=提取数据之后时间-语法解析开始时间

▐ Добавить трассировку JDBC

Те, кто читал такие фреймворки, как Hibernate или MyBatis, должны понимать, что оператор находится в базовом пакете java.sql.

Оператор предоставляет объекты для выполнения статического оператора SQL и возврата полученных результатов. По умолчанию каждый объект Statement может одновременно открывать только один объект ResultSet.

Следовательно, если чтения одного объекта ResultSet чередуются с чтениями другого, каждое из них должно производиться другим объектом Statement. Все методы выполнения в интерфейсе оператора неявно закрывают текущий объект ResultSet для этого оператора, если существует открытый объект.

Продолжая просматривать исходный код, вы можете обнаружить, что PreparedStatement предварительно компилирует объект оператора SQL после того, как оператор предоставляет метод для выполнения. Операторы SQL предварительно компилируются и сохраняются в объектах PreparedStatement. Затем этот оператор может быть эффективно выполнен несколько раз с использованием этого объекта.

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

Определение реализации StatementWraper предоставляет объект для выполнения статического оператора SQL и возврата полученных результатов.

Запись подробностей журнала

public class PreparedStatementWraper extends StatementWraper
  implements PreparedStatement {
 private PreparedStatement raw;

 private String sql;

 public PreparedStatementWraper(PreparedStatement raw, String sql) {
  super(raw);
  this.raw = raw;
  this.sql = sql;
 }

 // ========== 记录日志 ==========
 @Override
 public ResultSet executeQuery() throws SQLException {
  long startTime = System.currentTimeMillis();
  try {
   return raw.executeQuery();
  } finally {
   doLog("executeQuery", sql, startTime);
  }
 }
....
j

Окончательный вывод журнала использует компонент logback для сбора журнала.

Такого рода проблемы были введены ранее