我的2007

态度决定高度,努力造就实力!

wuzhijie ID:zhijie435
44136次访问,排名2378(-1)好友0人,关注者0
zhijie435的文章
原创 79 篇
翻译 0 篇
转载 123 篇
评论 7 篇
最近评论
Cheng Chi:Agree!!根据我的一些测试经验,给兄弟加点料:
在以前跟同事讨论中也谈到这个话题,不过我的题目是“How to Keep Performance test simple, and Why?”
模拟真实环境的测试是需要的,但不是必须的,最好在项目接近结束时,进行一次全面的测试,并且进行压力测试以及长时间稳定性测试。
在相对简单甚至简陋的环境中进行性能测试,可以……
fg:高压带电显示装置
LED显示屏
磁钢
磁性……
elixirzhang:请问jdbc能实现compass增量么
masterkey:不错
dongwei:返回结果怎么才能用ec:分页?求助
文章分类
收藏
    相册
    我和儿子-悠悠的照片
    java技术
    SpringSide江南白衣
    web项目经理手册
    一个大学同学的blog
    一个年轻有为但略有缺点的老板同事
    一位老领导的个人网站
    不知何人,有些文章很经典
    低头赶路,抬头看天:现在公司老总的博客
    我的java老师的blog
    此人很“牛”
    老师换地方了
    职业生涯顾问Leo的专栏
    道理事,德处人;人脉和,事脉顺-专门讨论业务建模问题(还没来得及细看)
    项目管理(其他篇)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky

    原创 用jamon来监控你的sql执行效率收藏

    新一篇: MySQL show的用法 | 旧一篇: 优化程序之前,可用Jamon来监测你的Spring应用

    导读:

      相关文章: 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

    发表于 @ 2008年02月26日 18:01:00|评论(loading...)|编辑

    新一篇: MySQL show的用法 | 旧一篇: 优化程序之前,可用Jamon来监测你的Spring应用

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © zhijie435