監控和剖析數據庫操做-P6Spy、SQL Profiler、IronTrack SQL 使用簡介

在咱們 Java 開發應用程序的過程當中,不免會碰到系統的性能問題,特別在企業應用的開發過程當中,都會與數據庫進行打交道。當咱們碰到數據庫性能時,最有效的就是直接跟蹤每個 SQL 語句的執行狀況,SQL 語句的優化、索引的優化每每也是最容易取得最直接的效果的。 html

下面,咱們首先開始介紹 P6Spy 這個剖析工具,看它是如何無侵入性地進行數據庫操做的監控與剖析。 java

P6Spy 正則表達式

P6Spy 是一個能夠用來在應用程序中攔截和修改數據操做語句的開源框架。經過 P6Spy 咱們能夠對 SQL 語句進行攔截,至關於一個 SQL 語句的記錄器,這樣咱們能夠用它來做相關的分析,好比性能分析。P6Spy 用 Log4J 來記錄 JDBC 調用的日記信息。 sql

自從 2003 年 11 月 30 日 P6Spy 版本 1.3 發佈後,已經被下載超過 19,000 次了。P6Spy 支持 WebSphere、WebLogic、JBoss、Resin 和 Tomcat 等絕大多數的應用服務器。 數據庫

使用步驟 express

首先,你的應用系統應當是基於數據庫的,而後你須要去獲取 P6Spy 相關的文件(在 參考資源 中能夠找到下載連接,您能夠直接下載軟件包)。下面介紹 P6Spy 的安裝與使用的詳細操做過程: apache

  1. 下載 P6Spy 的文件包,也能夠下載它的源文件包來研究;
  2. 把 P6Spy 的 jar 包 p6spy.jar 放到 CLASSPATH 中,若是是 Web 應用程序則放在 YourWebApp/WEB-INF/lib/ 目錄下;
  3. 把 spy.properties 放到 CLASSPATH 目錄下,若是是 Web 應用程序放在 YourWebApp/WEB-INF/classess/ 目錄下,注意不是lib/ 目錄
  4. 修改你應用系統中的數據庫驅動名稱爲 P6Spy 的驅動程序名稱 com.p6spy.engine.spy.P6SpyDriver 其它的所有使用默認值,暫時先都不用修改;
  5. 打開配置文件 spy.properties 文件,找到 realdriver,把它的值改成你的應用系統的真正的數據庫驅動名稱;
  6. 運行你的應用程序或 Web 應用程序,能夠在 spy.log 裏看到 P6Spy 監測到的 SQL 詳細的執行與操做的記錄信息了,包含有完整的 SQL 執行參數。

P6Log 與 P6Outage 編程

在 P6Spy 發佈包中,它包含 P6Log 和 P6Outage 兩個模塊: 服務器

  1. P6Log

    P6Log 是用來攔截和記錄任務應用程序的 JDBC 語句的。這個功能對於開發者監控 EJB 服務器上的 SQL 語句執行狀況尤爲有用,可讓開發者完成儘量高效的代碼。同時 P6Spy 的部署是極其簡單的,並且根本不須要更改任何一行代碼,即對現有的應用是無侵入性的。 架構

    realdriver= (your driver)       (你的實際 JDBC 驅動程序名稱)
    executionthreshold=整數時間     (以毫秒爲單位)

  2. P6Outage

    P6Outage 專門用來檢測和記錄執行時間比較長的 SQL 語句,P6Outage 只記錄超過配置條件裏時間的那些信息,並對可能影響到數據庫的運行效率減少到最低。

    #outagedetection=true|false    (是否記錄較長時間運行的語句)
    #outagedetectioninterval=整數時間 (以秒爲單位)

架構原理

簡單地講,咱們能夠認爲 P6Spy 就是一個代理(Proxy),它只作了一層對 JDBC 驅動的攔截,而後轉發出去,這樣的設計與實際的應用程序沒有任何的耦合性,除了在配置中將驅動程序改爲 P6Spy 的攔截驅動外,程序其餘地方並不須要作任何的改變。這層攔截器除了可能會給系統帶來略微的性能降低外,對程序其餘方面沒有任何的影響。而相對於這一點點的性能降低,在開發環境中對於開發人員來講是沒法感受到,相比它所帶來的好處,徹底能夠忽略不計。


圖 1. P6Spy 對數據庫進行攔截監控的處理過程

  

問題與解決


若是在你的應用程序啓動後,卻在 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 數據源的一些定製信息,以分號分隔。


SQL Profiler

SQL Profiler 是一個由 Jahia.org 提供的基於 P6Spy 引擎的快速剖析工具,用來統計 SQL 查詢語句以便了解哪裏是性能瓶頸,在哪裏建立索引或者採起相應的辦法才能提升效率,而且能根據 SQL 查詢語句的狀況幫你生成合適的索引腳本。

這個小工具能夠實時地顯示數據庫查詢的狀況,經過集成的 SQL 解析器,在訪問大多數表與列上面創建統計分析,並生成索引腳本。固然,其它的信息也會進行收集和顯示,好比:單個數據庫請求的時間、一類請求的時間以及全部請求的時間。所以,能夠有效地經過視圖的排序來檢測數據的性能問題所在。這個工具對於大量的須要進行分析的請求是很是有用的,而不是人工一個個地去作分析。當你須要知道好比對相同的表和列進行訪問可是採用不一樣的查詢值時,這種分組的查詢能夠用創建在 ANTLR 上的 SQL 解析器進行分析。

使用步驟

首先,你的應用系統一樣也應當是基於數據庫的,而後你須要去獲取 SQL Profiler 相關的文件(在 參考資源 中能夠找到下載連接,您能夠直接下載軟件包)。下面介紹 SQL Profiler 的安裝與使用的詳細操做過程:

  1. 下載 SQL Profiler 的文件包進行安裝;
  2. 把 p6spy.jar 及 sqlprofiler.jar 放到 CLASSPATH 中,若是是 Web 應用程序則放在 YourWebApp/WEB-INF/lib/ 目錄下;
  3. 把 spy.properties 放到 CLASSPATH 目錄下,若是是 Web 應用程序就放在 YourWebApp/WEB-INF/classess/ 目錄下,注意不是lib/ 目錄;
  4. 修改你應用系統中的數據庫驅動名稱爲 P6Spy 的驅動程序名稱 com.p6spy.engine.spy.P6SpyDriver 其它的所有使用默認值,暫時不用修改;
  5. 打開 spy.properties 文件,把 realdriver 的值改成你的程序的數據庫驅動名稱;
  6. 注意要先運行 java -jar sqlprofiler.jar 來啓動 SQL Profiler,併成功看到啓動界面;
  7. 而後再啓動你的應用程序或服務器,並開始進行正常的系統請求處理操做;
  8. 這樣就能夠在 SQL Profiler 圖形化的界面上看到結果並進行分析了。

分析結果

通過一段時間的系統運行後,點擊 Pause 按鈕中止攔截,能夠獲得分析結果以下圖:


圖 2. SQL Profiler 的分析結果 Profiler 視圖
圖 2. SQL Profiler 的分析結果 Profiler 視圖  

接着,能夠切換到 Loggers 視圖,這是 Lgger 視圖的信息:


圖 3. SQL Profiler 的分析結果 Logger 視圖
圖 3. SQL Profiler 的分析結果 Logger 視圖  

固然,也能夠切換到 Analysis 視圖,這是 Analysis 視圖的分析結果信息:


圖 4. SQL Profiler 的分析結果 Analysis 視圖
圖 4. SQL Profiler 的分析結果 Analysis 視圖  

在通過分析後,咱們能夠直接經過 SQLProfiler 提交的保存按鈕,直接導出應當進行數據庫優化的建議的索引腳本,經過查看索引腳本,咱們能夠看到建立索引的詳細 SQL 腳本,這樣,咱們就能夠很是方便地進行數據庫調優了。

問題與解決

最後一個須要注意的問題就是須要先啓動 SQLProfiler,而後再啓動應用程序或者 Tomcat 等應用服務器。這是由於 SQLProfiler 默認使用的是 Log4j 的 SocketAppender,因此要先啓動。不然,會因你的應用程序或應用服務器中的 Web 應用之類的因鏈接不到 Socket 的服務器(SQLProfiler 至關於 Socket 的服務器)而發生錯誤,能夠經過 SQL Profiler 控制界面最下面的鏈接狀態就能夠知道是否有程序鏈接上來。


圖 5. SQL Profiler 處於非鏈接狀態
圖 5. SQL Profiler 處於非鏈接狀態  

圖 6. SQL Profiler 處於鏈接狀態
圖 6. SQL Profiler 處於鏈接狀態  


IronTrack SQL

IronEye,一個專一於 JDBC 性能的監控和測試的開源項目,它包含有三個工具:IronEye SQL,IronEye Cache,IronTrack SQL。其中,IronEye SQL 用於監測 Java 應用和數據庫服務器之間查詢開銷的時間,診斷在性能方面是否存在着相關問題,讓開發人員在測試以前就能發現問題。IronEye 於 2003 年 10 月 1 日開始基於 Apache Software License 發佈。

IronEye SQL 這個輕量級的 Java 工具提供全部流動在數據庫與應用程序之間的 SQL 統計信息並用多張圖表展示,能夠快速優化程序的性能。

IronGrid 相對於 Continuous Integration 提出了 Continuous Performance 的概念,即在項目開發過程當中隨時關注性能問題,而不是傳統的出了問題再解決的方案。

IronGrid 在應用程序對數據庫的操做上的 Continuous Performance 是經過 IronTrack SQL 進行體現的。IronTrack SQL 能經過對 JDBC 的包裝來攔截應用程序對數據庫的請求,完成性能監控。IronTrack SQL 的好處在於不須要修改任何代碼或者在數據庫端安裝任何程序,只須要在測試時把依賴的 JDBC 替換就能夠了。

使用步驟

首先,你的應用系統一樣也應當是基於數據庫的,而後你須要去獲取 IronTrack SQL 相關的文件(在 參考資源 中能夠找到下載連接,您能夠直接下載軟件包)。下面介紹 IronTrack SQL 的安裝與使用的詳細操做過程:

  1. 下載 IronTrack SQL 的文件包進行安裝;
  2. 把 irontracksql.jar, p6spy.jar 和 log4j-1.2.8.jar 放到 CLASSPATH 中,若是是 Web 應用程序則放在 YourWebApp/WEB-INF/lib/目錄下;
  3. 把 spy.properties 放到 CLASSPATH 目錄下,若是是 Web 應用程序就放在 YourWebApp/WEB-INF/classess/ 目錄下,注意不是lib/ 目錄;
  4. 修改你程序的數據庫驅動名稱爲 P6Spy 的驅動程序名稱 com.p6spy.engine.spy.P6SpyDriver 其它的都不用更改;
  5. 打開配置文件 spy.properties 文件,找到 realdriver,把它的值改成你的應用系統的真正的數據庫驅動名稱;
  6. 設置監聽端口號 monitorport=2000
  7. 先運行 java -jar irontracksql.jar 來啓動 IronTrack SQL;
  8. 再啓動你的應用程序或服務器;
  9. 能夠在 IronTrack SQL 圖形化的界面上看到結果並進行分析了。

鏈接設置

點擊「Config」按鈕就能夠設置主機名、端口與刷新的時間(毫秒爲單位)。根據你的服務器與端口的不一樣而進行相應地改變,下面以本地和 2000 端口,刷新時間爲 500 毫秒爲示例。設置完成後,肯定,點擊「Connect」就能夠鏈接應用系統並進行監測與分析了,當要中止分析時,只要點擊「Disconnect」按扭便可馬上中止分析了。

在分析的過程當中,咱們能夠根據須要點擊「Purge」按鈕,它能夠清除目前所監測到的內容,而後從新進行記錄監測信息,很方便地進行從新開始。


圖 7. IronTrack SQL 鏈接示例
圖 7. IronTrack SQL 鏈接示例  

分析結果

通過一段時間的系統運行後,咱們能夠直接獲得分析的結果與相應的圖形分析示例。相關的信息顯示以下:


圖 8. IronTrack SQL 分析結果
圖 8. IronTrack SQL 分析結果  
  • Count 列顯示 SQL 語句的調用次數;
  • Avg Time 列顯示 SQL 語句的執行平均時間;
  • Max Time 列顯示 SQL 語句花費的最高時間;
  • SQL 列顯示真正執行的 SQL 語句內容。

同時也能夠經過設置過濾條件來顯示指定條件的結果,好比:只關注平均調用次數大於 100 次 的結果。點擊「Filtering」左邊的小三角圖標,能夠顯示以下的過濾條件設置欄目:


圖 9. IronTrack SQL 設置相關的過濾條件
圖 9. IronTrack SQL 設置相關的過濾條件  

設置完成後,點擊「Apply Filter」按鈕便可以獲取所須要的相關結果了。這樣能夠更加方便地集中精力進行所須要的內容分析,能夠更加方便快速地定位到問題的所在之處,而後進行解決。

回頁首

總結

經過使用 P6Spy、SQL Profiler、IronTrack SQL 工具,咱們能夠無侵入已有的應用系統而有效地進行數據庫操做的監控與剖析,爲發現系統的性能瓶頸,尋找系統的性能調優提供了至關便利的方法。


參考資料

學習

得到產品和技術

相關文章
相關標籤/搜索