使用log4jdbc在不改变原有代码的情况下,就可以收集执行的SQL文和JDBC执行情况。
平时开发使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺点是占位符与参数是分开打印的,如果想要拷贝sql至PLSQL Developer客户端直接执行,需要自己拼凑sql。而log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,方便直接拷贝sql在PLSQL Developer等客户端直接执行,加快调试速度。
下载log4jdbc的jar包log4jdbc-1.2.jar以及依赖的相关Jar包log4j-1.2.17.jar、slf4j-api-1.6.0.jar、slf4j-log4j12-1.7.7.jar,如下图所示:
配置log4j的log4j.properties的配置文件,如下所示:
log4j.logger.jdbc.sqlonly=DEBUG,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n log4j.logger.jdbc.sqltiming=INFO,console log4j.logger.jdbc.connection=INFO,console
修改dbconfig.properties配置文件的url和driverClassName
url:jdbc:log4jdbc:mysql://localhost:3306/xdptest driverClassName:net.sf.log4jdbc.DriverSpy username:root password:root filters:stat maxActive:200 initialSize:20 maxWait:60000 minIdle:10 timeBetweenEvictionRunsMillis:60000 minEvictableIdleTimeMillis:300000 validationQuery:SELECT 'x' testWhileIdle:true testOnBorrow:false testOnReturn:false removeAbandoned:false removeAbandonedTimeout:1800 logAbandoned:true
经过这样的配置之后,就可以使用log4jdbc记录应用系统执行的SQL信息了。编写一个测试Servlet进行测试,代码如下:
package me.gacl.web.controller; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import me.gacl.util.DataSourceUtil; public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sql = "INSERT INTO LD_USER(ID,USERNAME,USERCODE,PASSWORD) VALUES(?,?,?,?)"; Connection connection = DataSourceUtil.getConnection(); PreparedStatement pstmt = null; try { pstmt = connection.prepareStatement(sql); pstmt.setString(1, UUID.randomUUID().toString()); pstmt.setString(2, "孤傲苍狼"); pstmt.setString(3, "gacl"); pstmt.setString(4, "xdp"); int executeResult = pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally{ try { pstmt.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
访问TestServlet,执行doGet方法往数据库中插入数据,log4jdbc记录的SQL信息如下图所示:
可以看到,log4jdbc记录出了SQL的执行的时间,执行时的参数以及执行耗时。这对于我们在开发中查找SQL错误是非常有帮助的。