在公司使用ibaits做持久层存储。虽然ibatis是半自动的,可以编写sql,但是跟一大堆的xml放在一起看起来很不直观。之前虽然可以配置log4j可以打印执行的sql,但是输出的只是预编译的,其中充斥着?,传入的参数不能能直观的检查。在测试的时候往往想查看执行的sql到底是什么,这样对于定位错误非常有用。在网上找到两个工具包来解决这个问题:p6spy和sql_profiler。
访问链接如下:
P6spy: http://www.p6spy.com/
Sqlprofiler:http://www.jahia.org/jahia/page377.html(打不开,难道要CROSS WALL--shit,敏感词汇)
大致原理:sqlprofiler其主要作用就是对数据库进行拦截监控,P6Spy 就是一个代理它只做了一层对 JDBC 驱动的拦截,然后转发出去。它用log4j来记录操作日志。
下载p6spy-install.zip解压缩后的目录文件如下图:
使用方法:
目前p6spy的版本为1.3,在项目中增加依赖:
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>1.3</version>
</dependency>
目录中有一个spy.properties配置文件,将其放置到classpath下,该文件详细的配置了p6spy]的运行参数。前面提到p6spy的代理机制,所以我们需要使用它提供的驱动(其他的数据库连接URL什么的无需修改):
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName">
<value>com.p6spy.engine.spy.P6SpyDriver</value>
</property>
<property name="url">XXX </property>
<property name="username">XXX </property>
<property name="password">XXX</property>
</bean>
在spy.properties文件中配置我们实际使用的数据库驱动:
# oracle driver
# realdriver=oracle.jdbc.driver.OracleDriver
# mysql Connector/J driver
# realdriver=com.mysql.jdbc.Driver
# informix driver
# realdriver=com.informix.jdbc.IfxDriver
# ibm db2 driver
# realdriver=COM.ibm.db2.jdbc.net.DB2Driver
# the mysql open source driver
#realdriver=org.gjt.mm.mysql.Driver
其中还有一个logfile属性可以配置日志文件输出的位置。
通过运行单元测试,的确在相应目录下生成了sql日志,但查看后发现该日志的可读性很差。所以使用sqlprofiler图形界面查看。
下载下来的sqlprofiler-0.3-bin的目录结构如图:
我们使用sqlprofiler的GUI控制介面,说白了就是一个监听器,在你通过p6spy进行数据库操作时,他就会很清晰地跟踪并列出你的操作,比单单查看那个恶心的spy.log来得舒服!既然基于p6syp当然也要用到p6syp.jar这个包咯,只是必须使用我们下载到的sqlprofiler.zip中的spy.properties来替换原来的项目中的那个文件,因为这个文件是定制过的,所谓的监听器也是靠这个文件才起作用的。同样的需要配置相关参数,修改realDriver和logfile的配置。
运行sqlprofiler.jar并执行测试,可以看到图形界面效果如下: