spring
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
spring