Hibernate обеспечивает ведение журнала SQL из коробки, но такое ведение журнала показывает только подготовленные операторы, а не фактические запросы SQL, отправленные в базу данных.
Он также не регистрирует время выполнения каждого запроса, что полезно для устранения неполадок производительности. В этом сообщении будет рассказано, как настроить ведение журнала запросов Hibernate, а затем сравнить его с ведением журнала, которое можно получить с помощью log4jdbc .
Функциональность ведения журнала запросов Hibernate
Hibernate не регистрирует реальные запросы SQL, отправленные в базу данных. Это связано с тем, что Hibernate взаимодействует с базой данных через драйвер JDBC, которому он отправляет подготовленные операторы, но не фактические запросы.
Таким образом, Hibernate может регистрировать только подготовленные операторы и значения их параметров привязки, но не сами запросы SQL.
Вот как выглядит запрос при входе в Hibernate:
|
1
2
3
4
5
|
select /* load your.package.Employee */ this_.code, ... from employee this_ where this_.employee_id=?TRACE 12-04-2014@16:06:02 BasicBinder - binding parameter [1] as [NUMBER] - 1000 |
См. Этот пост. Почему и где Hibernate выполняет этот SQL-запрос? как настроить этот тип регистрации.
Использование log4jdbc
Для разработчика полезно иметь возможность скопировать запрос из журнала и выполнить запрос непосредственно в клиенте SQL, но как переменные-заполнители ? сделать это невыполнимым.
Log4jdbc в инструмент с открытым исходным кодом, который позволяет делать именно это, и многое другое. Log4jdbc — это шпионский драйвер, который оборачивается вокруг реального драйвера JDBC, регистрируя запросы по мере их прохождения.
Версия, на которую ссылается этот пост, обеспечивает интеграцию с Spring, в отличие от нескольких других форков log4jdbc.
Настройка log4jdbc
Сначала включите библиотеку log4jdbc-remix в ваш файл pom.xml. Эта библиотека является веткой оригинального log4jdbc:
|
1
2
3
4
5
|
<dependency> <groupId>org.lazyluke</groupId> <artifactId>log4jdbc-remix</artifactId <version>0.2.7</version></dependency> |
Затем найдите в конфигурации Spring определение источника данных. Например, при использовании элемента поиска JNDI вот как выглядит источник данных:
|
1
2
|
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/some-db" /> |
Найдя определение источника данных, переименуйте его в следующее имя:
|
1
2
|
<jee:jndi-lookup id="dataSourceSpied" jndi-name="java:comp/env/jdbc/some-db" /> |
Затем определите новый источник данных log4jdbc, который обертывает реальный источник данных, и дайте ему оригинальное имя:
|
01
02
03
04
05
06
07
08
09
10
|
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource" > <constructor-arg ref="dataSourceSpied" /> <property name="logFormatter"> <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter" > <property name="loggingType" value="SINGLE_LINE" /> <property name="margin" value="19" /> <property name="sqlPrefix" value="SQL:::" /> </bean> </property> </bean > |
При такой конфигурации ведение журнала запросов уже должно работать. Можно настроить уровень регистрации нескольких доступных регистраторов log4jdbc.
Оригинальная документация log4jdbc предоставляет дополнительную информацию о доступных регистраторах:
-
jdbc.sqlonly:jdbc.sqlonlyтолько SQL -
jdbc.sqltiming:jdbc.sqltimingSQL, пост-выполнение, включая статистику выполнения по времени -
jdbc.audit:jdbc.auditВСЕ вызовы JDBC за исключением ResultSets -
jdbc.resultset: все обращения к объектам ResultSet регистрируются -
jdbc.connection:jdbc.connectionсоединения, открывают и закрывают события
Регистратор jdbc.audit особенно полезен для проверки объема транзакций, так как он регистрирует события начала / фиксации / отката транзакции базы данных.
Это предлагаемая конфигурация log4j, которая будет печатать только SQL-запросы вместе со временем их выполнения:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
<logger name="jdbc.sqltiming" additivity ="false"> <level value="info" /> </logger> <logger name="jdbc.resultset" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.audit" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.sqlonly" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.resultsettable" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.connection" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.resultsettable" additivity ="false"> <level value="error" /> </logger> |
Вывод
Использование log4jdbc просто выполняет некоторую начальную настройку, но как только она установлена, ее действительно удобно иметь. Наличие настоящего журнала запросов также полезно для устранения неполадок производительности, как будет описано в следующем посте.
| Ссылка: | Spring / Hibernate улучшил ведение журнала SQL с помощью log4jdbc от нашего партнера по JCG Алексея Новика в блоге The JHades Blog . |