用jamon來監控你的sql執行效率

導讀:

  相關文章: X

  動態切換多數據源

  用apache的dbcp來建立數據庫連接池更多相關推薦

  /**

  *作者:張榮華

  *日期:2008-2-25

  **/

  之前有一篇文章講到如何使用jamon來監控請求以及方法得調用(原文地址見:http://www.javaeye.com/post/354575),本文屬於其姊妹篇,使用jamon監控系統的sql調用及其調用效率。

  需求:

  1我們知道在使用hibernate得時候,我們可以打開show sql選項,可以直接查看sql語句調用的情況,那麼當我們使用其他持久技術的時候我們也需要這個功能怎麼辦呢,沒有關係,jamon能夠幫我們做到。

  2 很多時候,不同的程序員會寫出不同的性能的sql,有時候可能會不小心或者因爲不知道而寫出性能很差的sql,我自己曾經就發生過這種事情,在500w條數據的表裏使用了一個limit來分頁,到後面,執行一條sql都需要幾分鐘,諸如此類的時候可能大家都有碰到過,如果能有監控sql性能的工具嵌在應用裏該多好,當然有jamon就可以幫我們做到。

  對於jamon來說,每一個query的執行之後的統計結果都會被保存下來,這些概要統計都以MonProxy-SQL開頭。這些統計中包括查詢執行的時間,有比如平均時間,執行總時間,最小執行時間,最大執行時間,這些東西難道不是我們正想要的嗎。

  那麼讓我們開始吧,我們知道,這些query執行的統計應該是在connection中被統計的,也就是說我們要代理一般的connection,而connection又是由datasource產生的,所以我們可以代理datasource,說幹就幹。

  一個datasource接口中關於connection的方法只有兩個:

  

  /**

  *

Attempts to establish a connection with the data source that

  * this DataSource object represents.

  *

  * @return a connection to the data source

  * @exception SQLException if a database access error occurs

  */

  Connection getConnection() throws SQLException;

  

  /**

  *

Attempts to establish a connection with the data source that

  * this DataSource object represents.

  *

  * @param username the database user on whose behalf the connection is

  * being made

  * @param password the user's password

  * @return a connection to the data source

  * @exception SQLException if a database access error occurs

  * @since 1.4

  */

  Connection getConnection(String username, String password)

  throws SQLException;

  

  也就是說我們只要override這兩個方法即可。

  根據這個思路我寫了以下代碼:

  

  /**

  * @author ahuaxuan(aaron zhang)

  * @since 2008-2-25

  * @version $Id$

  */

  public class MonitorDataSource implements DataSource {

  public DataSource realDataSource;

  public void setRealDataSource(DataSource realDataSource) {

  this.realDataSource = realDataSource;

  }

  public DataSource getRealDataSource() {

  return realDataSource;

  }

  public Connection getConnection() throws SQLException {

  //表示由jamon來代理realDataSource返回的Connection

  return MonProxyFactory.monitor(realDataSource.getConnection());

  }

  public Connection getConnection(String username, String password)

  throws SQLException {

  //表示由jamon來代理realDataSource返回的Connection

  return MonProxyFactory.monitor(realDataSource.getConnection(username,

  password));

  }

  }

  

  顯然這個一個代理模式。接下來就是生成這個代理類,我是在spring中註冊了這麼一個類:

  

  

  

  

  writeMonitorDataSource 所依賴的writeDataSource就是我們真正配置的datasource,比如:

  

  

  ${jdbc.driverClassName}

  

  

  ${jdbc.url}

  

  

  ${jdbc.username}

  

  

  ${jdbc.password}

  

  

  ${jdbc.maxActive}

  

  

  ${jdbc.maxIdle}

  

  

  ${jdbc.maxWait}

  

  

  

  好了,那麼在使用datasource的時候,我們應該用哪個呢,當然是writeMonitorDataSource這個裏,我們可以把它注入給jdbcTemplate,或者sessionfactory,或者其他需要用到datasource的地方。

  到這裏,就一切準備完畢了,我們可以看看我們sql語句的執行效率了(這個頁面的地址爲sql.jsp):

  見圖1

  當然要我們的應用能夠顯示這個頁面,我們需要把jamon的一組頁面拷到我們的應用中,這一組頁面包含在我提供下載的包中,最新的jamon版本是2.7。

  我們可以看到id爲153的那條sql語句執行了78ms,我要去看看這條sql語句是不是有點什麼問題或者是否有優化的可能性。

  當然,剛纔說到每一條sql語句都是有統計平均時間,最大最小執行時間等等,沒錯,在另外一個頁面jamonadmin.jsp上就包含這些內容

  見圖2

  上面的圖片代表hits表示執行次數,avg表示sql執行的平均時間,後面的min和max表示sql執行的最小耗時和最大耗時。從這裏我們能夠更直觀的看到我們每條sql語句執行的情況。很有用的一個功能。

  而且在上面那兩個頁面上,我們還可以選擇把sql執行的結果導出來,可以導成xml或excel格式。

  總結:使用jamon來監控我們的sql語句我覺得很有使用意義,而且使用jamon對我們的應用來說完全是鬆耦合的,根本不需要更改我們的業務邏輯代碼,完全是可插拔的,我們也可以開發時使用jamon,部署時拔掉jamon。有了它能夠使一些程序員能夠更多一點的關注自己所寫的sql的效率,當然如果之前開發的時候沒有使用jamon也沒有關係,即使上線後也可以查看一下sql語句是否有問題,比如哪些sql語句執行得比較頻繁,是否存在給其做緩存得可能性等等。總之使用jamon在應用程序中來監控我們得sql語句具有很強得實用意義,

  再次總結:jamon,很好,很強大。

  

  0b7f157f-985a-38b7-ac13-53d0d678dd84-thumb.jpg?1203925706

  

  描述:

  大小: 45.9 KB

  查看次數: 61

  

  573025f5-a851-3728-adb0-534396c2215b-thumb.jpg?1203925706

  

  描述:

  大小: 19.7 KB

  查看次數: 46

  jar.rar(320.2 KB)

  描述: 需要的jar文件

  下載次數: 24

  聲明:JavaEye文章版權屬於作者,受法律保護。沒有作者書面許可不得轉載。 推薦鏈接:

  推薦鏈接:

  普元軟件在北京和上海招聘技術高手加盟

  中國領先的電子商務網站-淘寶網招賢納士,誠聘Java工程師



本文轉自

http://www.javaeye.com/topic/164758

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章