使用log4jdbc记录SQL信息
一、log4jdbc的简单介绍
使用log4jdbc在不改变原有代码的情况下,就可以收集执行的SQL文和JDBC执行情况。
平时开发使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺点是占位符与参数是分开打印的,如果想要拷贝sql至PLSQL Developer客户端直接执行,需要自己拼凑sql。而log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,方便直接拷贝sql在PLSQL Developer等客户端直接执行,加快调试速度。
二、log4jdbc的使用
下载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的配置文件,如下所示:
#记录系统执行过的sql语句
#log4j.additivity.jdbc.sqlonly=true
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
#记录sql执行的时间,可以分析耗时的sql语句
#log4j.additivity.jdbc.sqltiming=true
log4j.logger.jdbc.sqltiming=INFO,console
#记录除了ResultSet外的所有JDBC调用情况。一般不需要。
#log4j.additivity.jdbc.audidt=true
#log4j.logger.jdbc.audit=INFO,console
#记录返回结果集信息
#log4j.additivity.jdbc.resultset=true
log4j.logger.jdbc.resultset=INFO,console
#记录数据库连接和释放信息,可记录当前的数据库连接数,便于诊断连接是否释放
#log4j.additivity.jdbc.connection=true
log4j.logger.jdbc.connection=INFO,console
编写一个测试Servlet进行测试,代码如下:
package com.lbf.action;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Test;
/**
* Servlet implementation class c
*/
@WebServlet("/c")
public class c extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String sql = "INSERT INTO L_USER(ID,USERNAME) VALUES(?,?)";
Connection connection=null;
try { //要将drivername和url改成这个样式
Class.forName("<span style="color:#ff6666;">net.sf.log4jdbc.DriverSpy</span>");
connection = DriverManager.getConnection("<span style="color:#ff6666;">jdbc:log4jdbc:mysql://localhost:3306/sshop</span>", "root", "root");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
PreparedStatement pstmt = null;
try {
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, UUID.randomUUID().toString());
pstmt.setString(2, "xxx");
int executeResult = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(pstmt!=null){
pstmt.close();
}
if(pstmt!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
访问TestServlet,执行doGet方法往数据库中插入数据,log4jdbc记录的SQL信息如下图所示:
2016-11-07 20:02:15.864 3. Connection opened
2016-11-07 20:02:15.871 com.lbf.action.c.doGet(c.java:41)
3. INSERT INTO L_USER(ID,USERNAME) VALUES('b9e1b35f-2dcb-40d0-994f-ee33144ffc70','xxx')
2016-11-07 20:02:15.873 INSERT INTO L_USER(ID,USERNAME) VALUES('b9e1b35f-2dcb-40d0-994f-ee33144ffc70','xxx')
{executed in 2 msec}
2016-11-07 20:02:15.874 3. Connection closed
转载自:http://www.cnblogs.com/xdp-gacl/p/4081848.html