我的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]
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章