Spring / Hibernate使用log4jdbc改进了SQL日志记录

这篇博客介绍了如何通过log4jdbc改进Hibernate的SQL日志记录。默认情况下,Hibernate只记录预编译的SQL语句,但log4jdbc作为一个间谍驱动,可以记录实际执行的SQL及执行时间,便于性能排查。文章详细说明了如何配置log4jdbc与Spring的集成,以及如何调整日志级别以满足不同需求。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值