我的SQL在哪裏--SQL跟蹤工具P6Spy介紹(s00n原作)
我的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. 目的
在確定應用程序性能的時候,更多地會關注其中SQL語句的執行情況及執行時間
調試程序的時候,想知道傳入SQL的參數數值
修改程序的時候,並不想過多的關注其他人所寫的程序細節,只要知道執行的SQL語句
比較關心程序的連接池中連接使用情況
7. 優點
不用去寫很多傳SQL參數值的語句
Log.debug(XXX.class, "referenceNo:" + entity.getReferenceNo());
不用去寫調試sql的語句
Log.debug(XXX.class, "sql:" + sql);
頁面執行某個操作,不用修改任何程序,即可知道程序做了哪些數據庫操作
可以查看每個SQL的執行效率情況,給SQL調優做一定的參考
可以查看LOG文件,參考某個JDBC Transction的執行情況
可以通過配置過濾出你關心的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
加入此行realdriver=oracle.jdbc.OracleDriver
修改
filter=true //是否過濾需要或不需要記錄的信息
include =
exclude=
append=false //每次重新生成LOG文件
dateformat=yyyyMMdd:HHmmss:SSS //設置日期格式
logfile = spy.log //設置LOG文件名
excludecategories=info,debug,result,batch,resultset //不用記錄日誌的categories
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
通過配置文件設置過濾器
重啓WEBLOGIC
刪除日誌文件spy.log
TELNET終端
傳入特殊的數值,然後再文件中查找此數值
十、 參考工具官方網站
2006-06-21[s00n]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.