MyException - 我的异常网
当前位置:我的异常网» SQL » 用jamon回监控你的sql执行效率

用jamon回监控你的sql执行效率

www.MyException.Cn  网友分享于:2013-10-26  浏览:49次
用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的方法只有两个:
/**
   * <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这两个方法即可。
根据这个思路我写了以下代码:
/**
 * @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中注册了这么一个类:
<bean id="writeMonitorDataSource" class="org.ahuaxuan.MonitorDataSource" destroy-method="close">
		<property name="realDataSource" ref="writeDataSource"/>
	</bean>


writeMonitorDataSource 所依赖的writeDataSource就是我们真正配置的datasource,比如:
<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,很好,很强大。
1 楼 wener 2008-02-26  
好东西,支持
2 楼 ahuaxuan 2008-02-26  
wener 写道
好东西,支持

用它我们可以做很多东西,比如性能监控系统,一个企业中必定有很多的app,那么所有的app都可以利用它来搜集请求的数据,不管是http请求,还是jdbc,这些数据都可以搜集起来,然后再统计分析,所以jamon是一个很有用的东西,虽然原理简单,但是自己开发一个成本也比较大,直接扩展它比如方便,真的是一个很好的东西,可惜没有人认识到它的价值
3 楼 sorphi 2008-02-26  
看起来不错。不过你是否问过DBA能够利用数据库提供的工具统计到类似的结果呢?或者说,对比后者,jamon有啥优点,有啥缺点?
4 楼 ahuaxuan 2008-02-26  
sorphi 写道
看起来不错。不过你是否问过DBA能够利用数据库提供的工具统计到类似的结果呢?或者说,对比后者,jamon有啥优点,有啥缺点?

这些问题我也想过
第一个问题,
数据库提供得工具来统计?

1 是两个部分要同时抓,数据库统计得是所有请求,一定程度上加大得数据库的压力,当然如果数据库压力不大的情况下这样做完全没有问题。

2 可以使用sniffer抓包来分析数据库的压力情况,但这种数据无法收集起来供我们所用。当然如果我们不需要这些数据,只是随便看看,遇到问题分析一下,使用sniffer不失为一个比较好的方案。

而对比jamon来说,jamon搜集的数据对我们来说失可以随意存储分析的,比如上面所说到的做一个负载分析系统,那么使用它来搜集数据对编程来说其实是非常方便的。
5 楼 galaxystar 2008-02-26  
用来统计一个页面到底有多少数据库请求不错。

性能方面,我所在的公司更重视SQL review,(因为有非常牛的DBA,ORACLE ACE)。
低性能sql基本都会被review这关挡掉。

而数据库压力,是在定技术方案时,就已经有底的。如果sql数据吞吐量会超标,会在这个阶段想好对策。


6 楼 leadyu 2008-02-26  
性能监控方面,也推荐下我的项目:jwebap.sourceforge.net

它不仅仅可以监控j2ee工程(包括EJB以及WebModule)的所有的jdbc调用,包括调用的堆栈(什么程序打开的连接),还可以监控方法的调用,以及http的请求,所有的这一切,只需要部署一个jar,以及配置一个配置文件。

另外,jwebap基于plugin架构,core部分基于jdk14,所有的监控组件都是plugin,大部分的plugin基于jdk14,以后会开发一些针对专属平台的plugin, 下阶段准备开发基于jdk15的memory_monitor_plugin。

它同时提供Web Console,界面也相当美观,全部通过jar包实现。下面贴几张出来:

7 楼 galaxystar 2008-02-26  
楼上的,界面是用ext做的吗?
8 楼 leadyu 2008-02-26  
是的,js放在jar包
9 楼 ahuaxuan 2008-02-26  
leadyu 写道


它不仅仅可以监控j2ee工程(包括EJB以及WebModule)的所有的jdbc调用,包括调用的堆栈(什么程序打开的连接),还可以监控方法的调用,以及http的请求,所有的这一切,只需要部署一个jar,以及配置一个配置文件。



你提供的功能jamon都有,但是你的界面看起来更好看,更耐看一点,赞一个。
jamon的界面太差劲了
10 楼 leadyu 2008-02-26  
jamon我了解不多,所以不好说,jwebap目前jdbc,method,http三个功能的plugin,应该说是jwebap-core初步完成以来实现的第一个扩展plugin的例子。

jwebap前期更专注于实现core部分,类静态增强,轨迹容器,和plugin管理,当core逐步成型后,我打算,把精力移到plugin这方面来,由于plugin我可以针对平台来做,所以,慢慢功能强大的多。

现在,有不少想法,初步打算实现的plugin:内存监控plugin,和JVM Reviewer。

后面,我还会开发一些基于测试人员使用的Debug的plugin。


总结:我希望jwebap一直能够做到针对不同人群和环境按需使用,同时在功能不断庞大后还能保持较轻的架子,这是一个好的profiling应该重视的
11 楼 leadyu 2008-02-26  
ahuaxuan 写道
leadyu 写道


它不仅仅可以监控j2ee工程(包括EJB以及WebModule)的所有的jdbc调用,包括调用的堆栈(什么程序打开的连接),还可以监控方法的调用,以及http的请求,所有的这一切,只需要部署一个jar,以及配置一个配置文件。



你提供的功能jamon都有,但是你的界面看起来更好看,更耐看一点,赞一个。
jamon的界面太差劲了



看了下jamon,应该说jwebap在部署方面真的简单太多了。

首先,jwebap对于jdbc的监控,根本不需要代理数据源,也不需要实现特定的代理驱动。而且jamon这种方式应该是没法监控jndi数据源的(从我初步从它的配置文档了解到的,我只能说应该:-) )

另外,对于EJB的监控,Jwebap也根本不需要配EJB的代理,只要在method plugin的'detect-class'参数里,配置想监控的包名即可,如"test.ejb.*;com.ejb.*;"

jwebap的部署,只需要丢个jar包,配下jwebap.xml 和对应的web.xml即可。


我觉得可以这么归结:


第一代prfiling tools:基于代理,代理,又代理的思想,实现monitor。缺点是,部署麻烦,甚至是还需要修改项目代码才能部署,功能也不强。比如jamon和P6SQL

第二代prfiling tools:基于专属平台JVMPI,缺点:给系统带来了10-20倍的性能负担,同时部署复杂,但是,功能强大,如jprofiler

第三代prfiling tools:出现了BCEL,后更有ASM等字解码指令操作框架,介于jdk14-15之间。基于字解码操作,profiling实现了真正意义的动态monitor。这种profiling部署简单,性能高,但是功能不算非常强大。

第四代prfiling tools:出现jdk instrument。更有aspectJ。这时profiling功能得到增强,但是丢失了大量停留在jdk14的用户,同时部署也不简单。


Jwebap从这种划分,应该说,处于第三代和第四代之间,Jwebap-core采用第三代技术,plugin则很任意,介于第四代技术。
12 楼 e3002 2008-03-02  
spring中已经集成了jamon
13 楼 hahabk 2008-07-16  
如果我里头的配置文件是这样的,怎么来做呢!


  <transactionManager type="JDBC">
    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="${driver}"/>
      <property name="JDBC.ConnectionURL" value="${url}"/>
      <property name="JDBC.Username" value="${username}"/>
      <property name="JDBC.Password" value="${password}"/>
      <property name="JDBC.DefaultAutoCommit" value="true"/>

      <property name="Pool.MaximumActiveConnections" value="40"/>
      <property name="Pool.MaximumIdleConnections" value="5"/>
      <property name="Pool.MaximumCheckoutTime" value="12000"/>
      <property name="Pool.TimeToWait" value="2000"/>
      <property name="Pool.PingQuery" value="select 1 from dual"/>
      <property name="Pool.PingEnabled" value="false"/>
      <property name="Pool.PingConnectionsOlderThan" value="0"/>
      <property name="Pool.PingConnectionsNotUsedFor" value="0"/>
     
    </dataSource>
  </transactionManager>
14 楼 hahabk 2008-07-16  
正在想对现在的项目进行监控,但项目配置跟楼主不一样,不知道如何下手,请楼主指点一下啊!谢谢
15 楼 hy0231 2008-12-01  
jamon怎样查看监视结果????????好像好没有人说下.
16 楼 hxirui 2008-12-16  
org.jwebap.config.ConfigException: 配置工厂未初始化,请调用 configure(String path) 进行初始。
org.jwebap.config.ConfigurationCacher.getConfiguration(ConfigurationCacher.java:47)
org.jwebap.ui.controler.DispatcherFactory.createDispatcherChain(DispatcherFactory.java:34)
org.jwebap.ui.controler.JwebapServlet.doGet(JwebapServlet.java:41)
javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
17 楼 annegu 2008-12-16  
大哥,你的错是jwebap抛出来的呀,你没有用jamon,是不是贴错地方了
18 楼 chijq 2008-12-16  
目前我们在遇到性能问题时也会使用JAmon进行监控,效果哦很好

配置也很简单
在web.xml中增加filter,在applicationContext增加性能拦截器和代理数据源即可

分析内容还是很充分的,推荐使用
19 楼 swen00 2008-12-18  
当然要我们的应用能够显示这个页面,我们需要把jamon的一组页面拷到我们的应用中,这一组页面包含在我提供下载的包中


-----------------------------
老大,你提供的在哪里?怎么配置页面显示?


搞定了,老大你给的包里没有,要去下载个最新的版本里,里面有war包,将需要页面sql.jsp拷贝进去就可以了
http://jamonapi.sourceforge.net

20 楼 bluejiejie 2009-01-05  
我写了个MonitorDataSource的类override之前的DataSource,并在applicationContext.xml配置完,运行sql.jsp报错,发现里面有句sql:select * from array,这是什么意思呢?不是说sql.jsp不用改就能看到效果吗?

文章评论

为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员的鄙视链
程序员的鄙视链
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
鲜为人知的编程真相
鲜为人知的编程真相
Java程序员必看电影
Java程序员必看电影
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员都该阅读的书
程序员都该阅读的书
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
旅行,写作,编程
旅行,写作,编程
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
一个程序员的时间管理
一个程序员的时间管理
代码女神横空出世
代码女神横空出世
10个调试和排错的小建议
10个调试和排错的小建议
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些争议最大的编程观点
那些争议最大的编程观点
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
如何成为一名黑客
如何成为一名黑客
老程序员的下场
老程序员的下场
每天工作4小时的程序员
每天工作4小时的程序员
漫画:程序员的工作
漫画:程序员的工作
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
编程语言是女人
编程语言是女人
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我是如何打败拖延症的
我是如何打败拖延症的
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
中美印日四国程序员比较
中美印日四国程序员比较
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有