使用log4jdbc在不改變原有代碼的狀況下,就能夠收集執行的SQL文和JDBC執行狀況。java
平時開發使用的ibatis,hibernate,spring jdbc的sql日誌信息,有一點個缺點是佔位符與參數是分開打印的,若是想要拷貝sql至PLSQL Developer客戶端直接執行,須要本身拼湊sql。而log4jdbc是在jdbc層的一個日誌框架,能夠將佔位符與參數所有合併在一塊兒顯示,方便直接拷貝sql在PLSQL Developer等客戶端直接執行,加快調試速度。mysql
下載log4jdbc的jar包log4jdbc-1.2.jar以及依賴的相關Jar包log4j-1.2.17.jar、slf4j-api-1.6.0.jar、slf4j-log4j12-1.7.7.jar,以下圖所示:web
配置log4j的log4j.properties的配置文件,以下所示:spring
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和driverClassNamesql
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進行測試,代碼以下:apache
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信息以下圖所示:api
能夠看到,log4jdbc記錄出了SQL的執行的時間,執行時的參數以及執行耗時。這對於咱們在開發中查找SQL錯誤是很是有幫助的。網絡