我的
SQL
在哪里(s00n原作)
-SQL
跟踪工具
P6Spy
介绍
一、 P6Spy介绍
1.
简介
P6spy是一个开源项目,可以用来拦截JDBC调用,记录JDBC调用的日志信息,并可以根据调用时间长短的时间设置来记录日志,P6Spy包括两个组件P6Log,P6Outage
2.
版本
P6Spy version 1.3 (
www.p6spy.com)
3.
P6Log组件
按需记录JDBC日志
4.
P6Outage组件
可以检测到记录运行时间较长的JDBC statement.,这些可能会影响到数据库的运行效率,并可将这些调用产生日志。
# outagedetection=true|false
(是否记录较长时间运行的statement)
# outagedetectioninterval=时间 (以秒记)
二、 工具的使用范围,目的,优点
5.
范围
开发环境
6.
目的
7.
优点
Log.debug(XXX.class, "referenceNo:" + entity.getReferenceNo());
Log.debug(XXX.class, "sql:" + sql);
8.
缺点
参考
对环境的影响
三、 修改工具源代码文件(为便LOG文件不过大,减少一些不必要的LOG)
9.
P6ResultSet.java
注释//P6LogQuery.log("resultset", query, buffer.toString());
程序每次的resultSet.next()信息都会记录到LOG表,而且不能通过过滤器来过滤,为减少LOG表的大小,这里注释。
10.
FormattedLogger.java
加入如下语句
sql=sql.length()>1000?sql.substring(0,1000)+"......":sql;
prepared=sql.trim().length()>0?"":prepared;
//对于有些SQL的参数有clob字段,这样LOG文件会非常的大.所以做截取.
//另外当sql有值时,我们过滤掉prepared的字符,以减少LOG文件的大小
四、 在GSBL开发环境安装
11.
配置文件spy.properties
filter=true
//是否过滤需要或不需要记录的信息
include =
exclude=
12.
上传p6spy.jar
放在/weblogic81/server/ext/下
13.
上传spy.properties
放在/weblogic81/server/ext/下
14.
startWeblogic.sh
修改bea/weblogic700/server/bin/startWeblogic脚本,
:${WL_HOME}/server/ext/p6spy.jar:${WL_HOME}/server/ext
15.
数据库连接Driver Classname
在weblogic console的Services/JDBC/Connection Pools下把所有的Connection Pool的
Driver Classname改成com.p6spy.engine.spy.P6SpyDriver
五、 对环境的影响
从上面安装来看,P6Spy只做了一层Driver的拦截器,与程序无耦合性,除了Driver改成了P6Spy的,程序其他地方并没有任何的改变,这层拦截器除了可能有略微的性能下将,对程序其他方面没有任何的影响。而这点性能下降,在开发环境开发人员无法感觉到,相比所带来的好处,可以忽略。
六、 LOG文件
16.
位置
/user_projects/domains/mydomain/spy.log
17.
文件生成规则
append=false //每次重起服务器重新生成LOG文件
七、 LOG文件内容格式
current time|execution time|connectionId|category|statement SQL String|effective SQL string
18.
category
可以通过# filter what is logged
filter=true
include =
exclude =
这三项的category设置来过滤(不)需要记录或信息
error –P6Spy的出错信息
info –包括启动及其他信息
debug -调试信息,记录的信息非常多
statement –包括 Statements, PreparedStatements, and CallableStatements.
batch –包括 addBatch() JDBC API.
commit -包括commit() JDBC API.
rollback -包括rollback() JDBC API.
result -包括由ResultSet生成的语句
19.
statement SQL String
传给statement的sql语句
20.
effective SQL string
如果是程序使用的是prepared statement,可以查到带有实际运行时参数值的SQL语句。
21.
connectionId
连接ID
22.
current time
dateformat=yyyyMMdd:HHmmss:SSS
23.
execution time
执行时间,以ms记
24.
举例
20060616 16:19:50:326|2|1|statement|select * from T_QUOTE_INFO where 1=1 and POLICY_ID = 1446981
八、 查看LOG文件
Telnet客户端连接上服务器以后
tail -f spy.log
九、 怎样在LOG文件中找到自己的SQL
十、 参考工具官方网站
2006-06-21[s00n]