java中使用P6Spy 打印sql
今天才发现原来还有 p6spy http://sourceforge.net/projects/p6spy 这么个东东,相见恨晚,想当年为自己基于jdbc手写了整个数据访问层的时候,还得意可提供完整的sql日志。
这里记一下spring配置:
Maven
首先maven 见http://mvnrepository.com/artifact/p6spy/p6spy/1.3
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>1.3</version> </dependency>
配置spring:
<bean id="orginDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${database.jdbc.driverClassName}"/> <property name="url" value="${database.jdbc.url}"/> <property name="username" value="${database.jdbc.username}"/> <property name="password" value="${database.jdbc.password}"/> <property name="testWhileIdle" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="3600000"/> <property name="validationQuery" value="SELECT 1"/> <property name="minEvictableIdleTimeMillis" value="18000000"/> <property name="testOnBorrow" value="true"/> </bean> <bean id="dataSource" class="com.p6spy.engine.spy.P6DataSource" > <constructor-arg> <ref local="orginDataSource"/> </constructor-arg> </bean>
我用的dbcp连接池,加入p6spy还是比较方便的。注意dataSource这个bean才是被注入到程序中的bean,它只是包装了orginDataSource这个bean。另外网上的配置都有destroy-method="close"这个,我看了下的包,p6spyDataSource这个类根本就没有close方法,不知是版本问题还是怎的。
最后配置spy.properties
https://code.google.com/p/p6spy-mvn/downloads/list 这里有例子,直接下下来放在/src/main/resources文件夹中
针对你的实际情况修改,这里我需要使用log4j日志
不需要realdriver这个配置,都可以注释掉,因为使用的是包装方式
#realdriver=oracle.jdbc.driver.OracleDriver
需要下面的配置
module.log=com.p6spy.engine.logging.P6LogFactory
appender=com.p6spy.engine.logging.appender.Log4jLogger
#这些配置和log4j是一样的
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n
#可以使用系统变量的
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.File=${conf}/xxx.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10000KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=10
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=%5p [%d{yy-MM-dd HH:mm:ss,SSS}] [%t] - %m%n
log4j.logger.p6spy=INFO,STDOUT,ROLLING_FILE
好了,运行后就会发现类似输出:
INFO [13-02-21 14:30:50,906] [main] - 1361428250906|0|0|statement|select * from tbl_xxx where 1=1 and rpt = ? and id = ? and active = ?|select * from tbl_xxx where 1=1 and rpt = 'false' and id = '0' and active = 'true'
可见最后一个是实际的sql语句,不过这样有点麻烦,需要拖动横向滚动条才能看到,还是我的显示屏不够宽哈,。
另外可以使用工具来分析作为性能参考。
参见:
http://swik.net/Spring/Spring%27s+corner/Integrate+P6Spy+with+Spring/vq6
http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/