Hibernate提供了开箱即用的SQL日志记录,但是这种日志记录仅显示准备好的语句,而不显示发送到数据库的实际SQL查询。
它还不会记录每个查询的执行时间,这对于性能故障排除很有用。 这篇博客文章将介绍如何设置Hibernate查询日志记录,然后将其与可以通过log4jdbc获得的日志记录进行比较。
Hibernate查询日志记录功能
Hibernate不会记录发送到数据库的实际SQL查询。 这是因为Hibernate通过JDBC驱动程序与数据库进行交互,它向其发送准备好的语句,但不发送实际的查询。
因此,Hibernate只能记录准备好的语句及其绑定参数的值,而不能记录实际的SQL查询本身。
这是由Hibernate登录时查询的外观:
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驱动程序中,并记录查询过程中的查询。
与其他几个log4jdbc分支不同,本文中链接的版本提供了Spring集成。
设置log4jdbc
首先在您的pom.xml中包含log4jdbc-remix库。 该库是原始log4jdbc的分支:
<dependency><groupId>org.lazyluke</groupId><artifactId>log4jdbc-remix</artifactId<version>0.2.7</version>
</dependency>
接下来,在Spring配置中找到数据源的定义。 例如,使用JNDI查找元素时,数据源的外观如下:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/some-db" />
找到数据源定义后,将其重命名为以下名称:
<jee:jndi-lookup id="dataSourceSpied" jndi-name="java:comp/env/jdbc/some-db" />
然后定义一个新的log4jdbc数据源,该数据源包装了真实的数据源,并为其指定了原始名称:
<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
:仅记录SQL -
jdbc.sqltiming
:记录SQL,执行后,包括定时执行统计信息 -
jdbc.audit
:记录除结果集外的所有JDBC调用 -
jdbc.resultset
:记录对ResultSet对象的所有调用 -
jdbc.connection
:记录连接打开和关闭事件
jdbc.audit
记录器对于记录事务范围特别有用,因为它记录了数据库事务的开始/提交/回滚事件。
这是建议的log4j配置,将仅打印SQL查询及其执行时间:
<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只是进行一些初始设置,但是一旦安装到位,便非常方便。 拥有真实的查询日志对于性能故障排除也很有用,这将在以后的文章中进行介绍。
翻译自: https://www.javacodegeeks.com/2014/06/springhibernate-improved-sql-logging-with-log4jdbc.html