使用log4jdbc记录SQL信息

使用log4jdbc记录SQL
本文介绍如何利用log4jdbc框架记录SQL语句及其执行情况,包括配置步骤及示例代码,有助于提升数据库操作的调试效率。

使用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值