現(xiàn)大家使用的ibatis,hibernate,spring jdbc的sql日志信息,有一點個缺點是占位符與參數(shù)是分開打印的,如果想要拷貝sql至PLSQL Developer客戶端直接執(zhí)行,需要自己拼湊sql。而log4jdbc是在jdbc層的一個日志框架,可以將占位符與參數(shù)全部合并在一起顯示,方便直接拷貝sql在PLSQL Developer等客戶端直接執(zhí)行,加快調(diào)試速度。
?
一.簡單介紹:
1.沒有使用log4jdbc前sql顯示:
select username,password from bitth_date > ? and age < ? and username = ?
2.使用log4jdbc后sql顯示:
select username,password from bitth_date > to_date(‘2010-11-11’,’yyyy-mm-dd’) and age < 20 and username = ‘qq2008’ {executed in 2 msec}
這樣就可以直接拷貝上面的sql在PLSQL直接執(zhí)行.?最后的?{executed in 2 msec}?為SQL執(zhí)行時間.而如果mysql,日志信息將不會出現(xiàn) to_date()
?
?
二.log4jdbc使用:
?
1.spring xml配置(攔截需要處理的dataSource連接)
????log4jdbcInterceptordataSource
2.log4j.properties配置:
log4j.logger.jdbc.sqlonly=OFF log4j.logger.jdbc.sqltiming=INFO log4j.logger.jdbc.audit=OFF log4j.logger.jdbc.resultset=OFF log4j.logger.jdbc.connection=OFF
(日志信息如果全部為off,log4jdbc將不會生效,因此對性能沒有任何影響)
3.下載slf4j
??? log4jdbc需要依賴slf4j日志框架.?http://www.slf4j.org/
?
三.擴展說明
?
DataSourceSpyInterceptor為我自己擴展的一個攔截器類,擴展主要是使用AOP的方式,因為log4jdbc原來的方式不適合我的項目.具體源碼為:
import?org.aopalliance.intercept.MethodInterceptor; import?org.aopalliance.intercept.MethodInvocation; public?class?DataSourceSpyInterceptor?implements?MethodInterceptor?{ private?RdbmsSpecifics?rdbmsSpecifics?=?null; ????private?RdbmsSpecifics?getRdbmsSpecifics(Connection?conn)?{ ????????if(rdbmsSpecifics?==?null)?{ ????????????rdbmsSpecifics?=?DriverSpy.getRdbmsSpecifics(conn); ????????} ????????return?rdbmsSpecifics; ????} ???? public?Object?invoke(MethodInvocation?invocation)?throws?Throwable?{ Object?result?=?invocation.proceed(); if(SpyLogFactory.getSpyLogDelegator().isJdbcLoggingEnabled())?{ ???? if(result?instanceof?Connection)?{ ???? Connection?conn?=?(Connection)result; ???? return?new?ConnectionSpy(conn,getRdbmsSpecifics(conn)); ???? } } return?result; } }
?