Лучший способ логирования JDBC выражений

Введение

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

Hibernate logging

Hibernate предоставляет это hibernate.show_sql в свойствах конфигурации для включения логирования. К сожалению, логи попадают в консоль, что делает анализ очень трудным. Более лучшим подходом является использование лог адаптера:

<logger name="org.hibernate.SQL" level="debug"/>

Потому что Hibernate использует только PreparedStatement, значения аргументов не отображаются в логе:

 INSERT INTO post (title, version, id) VALUES (?, ?, ?) 

Хотя параметры могут быть залогированы отдельно (например org.hibernate.type.descriptor.sql), наиболее прямым путем логирования SQL выражения вместе со значениями аргументов является использование внешнего прокси DataSource. Из-за того что прокси перехватывает выполнение всех выражений, значения параметров могут быть проанализированы и так же распечатаны.

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

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

DataSource-proxy

Менее известный фреймворк для логирования работы JDBC, datasource-proxy поддерживает кастомные листенеры выполнения запросов. В Java EE, не все серверы приложений позволяет конфигурировать внешний DataSource, так как они полагаются на свои собственные реализации. datasource-proxy может не подходить для всех Java EE окружений, потому что он декорирует именно DataSource.

Это можно реализовать через программную конфигурацию Spring:

@Bean
public DataSource dataSource() {
    SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
    loggingListener.setQueryLogEntryCreator(new InlineQueryLogEntryCreator());
    return ProxyDataSourceBuilder
        .create(actualDataSource())
        .name(DATA_SOURCE_PROXY_NAME)
        .listener(loggingListener)
        .build();
}

В следующем примере, datasource-proxy испоьзуется для логирования пакетной операции вставки трех PreparedStatement(s). Хотя обычно батч печатается одной строкой лога, вывод был разбит на три строки чтобы вместиться в размеры страницы.

Name:DATA_SOURCE_PROXY, Time:6, Success:True,
Type:Prepared, Batch:True, QuerySize:1, BatchSize:3, 
Query:["insert into post (title, version, id) values (?, ?, ?)"], 
Params:[(Post no. 0, 0, 0), (Post no. 1, 0, 1), (Post no. 2, 0, 2)]

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

 

(Visited 480 times, 1 visits today)

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.