摘自: http://momo119.iteye.com/blog/1575143
p6spy 下載地址: http://sourceforge.net/projects/p6spy/?source=dlp
p6spy 組件,它可以攔截所有執行的 SQL 語句,而不管你使用的是什么 ORM 框架。對於 PrepareStatement 那樣帶參數(?) 的語句,它會幫你代上相應的參數值。
p6spy 的主頁是http://sourceforge.net/projects/p6spy/,它支持當前流行的應用服務器,如 JBoss、Orion、Tomcat、WebLogic、WebSphere 等,將spy.properties和p6spy.jar,拷貝到classes根目錄和lib目錄就可以了,其實不用太在意 p6spy 的安裝說明,關鍵是要了解了某個應用服務器本身,要搞清楚的一個問題是“誰在加載 p6spy 包,從哪里加載”,那么配置 p6spy 就不成問題了,你甚至可以把 p6spy 用在獨立的 Java 應用程序中。
p6spy 可以輸出日志到文件中、控制台、或者傳遞給 Log4j,而且還能配搭 SQL Profiler 或 IronTrackSQL 圖形化監控 SQL 語句,監測到哪些語句的執行是耗時的,逐個優化。關於與 SQL Profiler 或 IronTrackSQL 的配合使用可參數文件的鏈接。
如果在你的應用程序啟動后,卻在 spy.log 文件中發現了如下的提示信息,那就是驅動程序加載先后的問題了。
<你的程序的數據庫驅動名稱> is a real driver in spy.properties, but it has been loaded before p6spy. p6spy will not wrap these connections. Either prevent the driver from loading, or try setting'deregisterdrivers' to true in spy.properties
請把 spy.properties 配置文件里的
deregisterdrivers=false
改為
deregisterdrivers=true
,重新運行即可。
這是因為有些應用系統中會先於 P6Spy 加載了真正的數據庫的驅動程序,導致 P6Spy 無法監控到,設置
deregisterdrivers
為 true ,是顯式地把真正的數據庫的驅動程序進行反注冊掉,而采用 P6Spy 的驅動程序。
下表列出了 spy.properties 配置文件中的各配置項的名稱、默認值及其意義和相關注意事項:
配置項名稱 默認值 配置項意義及相關注意事項
module.log com.p6spy.engine.logging. P6LogFactory 用來攔截和記錄任務應用程序的 JDBC 語句。若無配置或注釋掉則無此功能。
module.outage com.p6spy.engine.outage. P6OutageFactory 檢測和記錄執行時間比較長的 SQL 語句。若無配置或注釋掉則無此功能。
realdriver 真正的應用系統使用的數據庫驅動程序名稱。
realdriver2 真正的應用系統使用的第二種備用數據庫驅動程序名稱。
realdriver3 真正的應用系統使用的第三種備用數據庫驅動程序名稱。
deregisterdrivers false 顯示地把真正的數據庫的驅動程序進行反注冊掉。取值 true| false
executionthreshold P6Log 模塊執行時間設置,整數值 (以毫秒為單位),只有當超過這個時間才進行記錄 Log。
outagedetection false P6Outage 模塊是否記錄較長時間運行的語句。取值 true| false
outagedetectioninterval P6Outage 模塊執行時間設置,整數值 (以秒為單位)),只有當超過這個時間才進行記錄 Log。
filter false 是否過濾 Log,取值 true| false
include 過濾 Log 時所包含的表名列表,以逗號分隔。
exclude 過濾 Log 時所排除的表名列表,以逗號分隔。
sqlexpression 過濾 Log 時的 SQL 表達式名稱
autoflush true 是否自動刷新。取值 true| false
dateformat 設置時間的格式,也就是用 Java 的 SimpleDateFormat 程序。
includecategories 顯示指定過濾 Log 時包含的分類列表,取值為 error,info,batch,debug,statement,commit,rollback,result 的各種組合。
excludecategories 顯示指定過濾 Log 時排隊的分類列表,取值同上。
stringmatcher 使用正則表達式來過濾 Log,取值為 com.p6spy.engine.common.GnuRegexMatcher 和 com.p6spy.engine.common.JakartaRegexMatcher
stacktrace false 打印堆棧跟蹤信息。取值 true| false
stacktraceclass 如果 stacktrace=true,則可以指定具體的類名來進行過濾。
reloadproperties false 監測屬性配置文件是否進行重新加載。取值 true| false
reloadpropertiesinterval 60 屬性配置文件重新加載的時間間隔,以秒為單位。
useprefix false 是否加上前綴,設置為 true,會加上 p6spy: 作為前綴。取值 true| false
appender com.p6spy.engine.logging. appender.FileLogger 指定 Log 的 appender,與 Log4J 有點同義,取值:com.p6spy.engine.logging.appender.Log4jLogger、 com.p6spy.engine.logging.appender.StdoutLogger 和 com.p6spy.engine.logging.appender.FileLogger
logfile spy.log 指定 Log 的文件名,任何適於操作系統的文件。
append true 指定是否每次是增加 Log,設置為 false 則每次都會先進行清空。取值 true| false
log4j.appender.STDOUT org.apache.log4j.ConsoleAppender 當 appender 為 log4j 時采用的配置,配置如同 Log4J 的相關配置。
log4j.appender.STDOUT.layout org.apache.log4j.PatternLayout 同上
log4j.appender.STDOUT. layout.ConversionPattern p6spy - %m%n 同上
log4j.logger.p6spy INFO,STDOUT Log 級別的設置,取值同 Log4J 的配置
realdatasource 設置數據源 DataSource 的配置名稱。
realdatasourceclass 設置數據源 DataSource 的類的全稱。
realdatasourceproperties 設置數據源 DataSource 的屬性,以分號分隔。
jndicontextfactory 設置 JNDI 數據源的 NamingContextFactory。
jndicontextproviderurl 設置 JNDI 數據源的提供者的 URL。
jndicontextcustom 設置 JNDI 數據源的一些定制信息,以分號分隔。
1.在log4j配置文件里加上
log4j.logger.org.hibernate.type=DEBUG,CONSOLE
就可以看到被綁定的各個參數的值。
2.用 P6Spy。
3.用proxool。
配置org.logicalcobwebs.proxool.admin.servlet.AdminServlet
然后在web界面察看sql。