1. 程式人生 > >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的配置檔案,如下所示:

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

複製程式碼
 1 url:jdbc:log4jdbc:mysql://localhost:3306/xdptest
 2 driverClassName:net.sf.log4jdbc.DriverSpy
 3 username:root
 4 password:root
 5 filters:stat
 6 maxActive:200
 7 initialSize:20
 8 maxWait:60000
 9
minIdle:10 10 timeBetweenEvictionRunsMillis:60000 11 minEvictableIdleTimeMillis:300000 12 validationQuery:SELECT 'x' 13 testWhileIdle:true 14 testOnBorrow:false 15 testOnReturn:false 16 removeAbandoned:false 17 removeAbandonedTimeout:1800 18 logAbandoned:true
複製程式碼

  經過這樣的配置之後,就可以使用log4jdbc記錄應用系統執行的SQL資訊了。

  編寫一個測試Servlet進行測試,程式碼如下:

複製程式碼
 1 /**
 2  * 
 3  */
 4 package me.gacl.web.controller;
 5 
 6 import java.io.IOException;
 7 import java.sql.Connection;
 8 import java.sql.PreparedStatement;
 9 import java.sql.SQLException;
10 import java.util.UUID;
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import me.gacl.util.DataSourceUtil;
16 
17 /**
18  * <p>ClassName: TestServlet<p>
19  * <p>Description: <p>
20  * <p>Company:廣州利迪網路科技有限公司 <p>    
21  * @author xudp
22  * @version 1.0 V
23  * @createTime 2014-11-5 下午01:49:49
24  */
25 public class TestServlet extends HttpServlet {
26 
27     public void doGet(HttpServletRequest request, HttpServletResponse response)
28             throws ServletException, IOException {
29         String sql = "INSERT INTO LD_USER(ID,USERNAME,USERCODE,PASSWORD) VALUES(?,?,?,?)";
30         Connection connection = DataSourceUtil.getConnection();
31         PreparedStatement pstmt = null;
32         try {
33             pstmt = connection.prepareStatement(sql);
34             pstmt.setString(1, UUID.randomUUID().toString());
35             pstmt.setString(2, "孤傲蒼狼");
36             pstmt.setString(3, "gacl");
37             pstmt.setString(4, "xdp");
38             int executeResult = pstmt.executeUpdate();
39         } catch (SQLException e) {
40             e.printStackTrace();
41         }finally{
42             try {
43                 pstmt.close();
44                 connection.close();
45             } catch (SQLException e) {
46                 e.printStackTrace();
47             }
48         }
49     }
50 
51     public void doPost(HttpServletRequest request, HttpServletResponse response)
52             throws ServletException, IOException {
53         this.doGet(request, response);
54     }
55 }

  訪問TestServlet,執行doGet方法往資料庫中插入資料,log4jdbc記錄的SQL資訊如下圖所示:

  

  可以看到,log4jdbc記錄出了SQL的執行的時間,執行時的引數以及執行耗時。這對於我們在開發中查詢SQL錯誤是非常有幫助的。