相關文章: 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,很好,很強大。
描述:
大小: 45.9 KB
查看次數: 61
描述:
大小: 19.7 KB
查看次數: 46
jar.rar(320.2 KB)
描述: 需要的jar文件
下載次數: 24
聲明:JavaEye文章版權屬於作者,受法律保護。沒有作者書面許可不得轉載。 推薦鏈接:
推薦鏈接:
普元軟件在北京和上海招聘技術高手加盟
中國領先的電子商務網站-淘寶網招賢納士,誠聘Java工程師
本文轉自
http://www.javaeye.com/topic/164758