用jamon来监控你的sql执行效率
生活随笔
收集整理的這篇文章主要介紹了
用jamon来监控你的sql执行效率
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/**
*作者:張榮華
*日期:2008-2-25
**/
之前有一篇文章講到如何使用jamon來監控請求以及方法得調用(原文地址見:[url]http://www.iteye.com/post/354575 [/url]),本文屬于其姊妹篇,使用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的方法只有兩個:
Java代碼
/** * <p>Attempts to establish a connection with the data source that * this <code>DataSource</code> object represents. * * @return a connection to the data source * @exception SQLException if a database access error occurs */ Connection getConnection() throws SQLException; /** * <p>Attempts to establish a connection with the data source that * this <code>DataSource</code> 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這兩個方法即可。
根據這個思路我寫了以下代碼:
Java代碼
/** * @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中注冊了這么一個類:
Java代碼
<bean id="writeMonitorDataSource" class="org.ahuaxuan.MonitorDataSource" destroy-method="close"> <property name="realDataSource" ref="writeDataSource"/> </bean>
writeMonitorDataSource 所依賴的writeDataSource就是我們真正配置的datasource,比如:
Java代碼
<bean id="writeDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${jdbc.driverClassName}</value> </property> <property name="url"> <value>${jdbc.url}</value> </property> <property name="username"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="maxActive"> <value>${jdbc.maxActive}</value> </property> <property name="maxIdle"> <value>${jdbc.maxIdle}</value> </property> <property name="maxWait"> <value>${jdbc.maxWait}</value> </property> </bean>
好了,那么在使用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,很好,很強大。
*作者:張榮華
*日期:2008-2-25
**/
之前有一篇文章講到如何使用jamon來監控請求以及方法得調用(原文地址見:[url]http://www.iteye.com/post/354575 [/url]),本文屬于其姊妹篇,使用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的方法只有兩個:
Java代碼
/** * <p>Attempts to establish a connection with the data source that * this <code>DataSource</code> object represents. * * @return a connection to the data source * @exception SQLException if a database access error occurs */ Connection getConnection() throws SQLException; /** * <p>Attempts to establish a connection with the data source that * this <code>DataSource</code> 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這兩個方法即可。
根據這個思路我寫了以下代碼:
Java代碼
/** * @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中注冊了這么一個類:
Java代碼
<bean id="writeMonitorDataSource" class="org.ahuaxuan.MonitorDataSource" destroy-method="close"> <property name="realDataSource" ref="writeDataSource"/> </bean>
writeMonitorDataSource 所依賴的writeDataSource就是我們真正配置的datasource,比如:
Java代碼
<bean id="writeDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${jdbc.driverClassName}</value> </property> <property name="url"> <value>${jdbc.url}</value> </property> <property name="username"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="maxActive"> <value>${jdbc.maxActive}</value> </property> <property name="maxIdle"> <value>${jdbc.maxIdle}</value> </property> <property name="maxWait"> <value>${jdbc.maxWait}</value> </property> </bean>
好了,那么在使用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,很好,很強大。
總結
以上是生活随笔為你收集整理的用jamon来监控你的sql执行效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帝国cms调用栏目自定义字段(栏目简介)
- 下一篇: linux基础命令练习1