用jamon来监控你的sql执行效率
2008-02-26 18:01
323 查看
导读:
相关文章: 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
*
* @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
*
* @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
相关文章: 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
DataSourceobject 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
DataSourceobject 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
相关文章推荐
- 根据mysql慢日志监控SQL语句执行效率
- 根据mysql慢日志监控SQL语句执行效率
- JAMon监控SQL执行时间
- druid监控每个服务数据库连接数和SQL执行效率
- ORACLE监控数据库性能的SQL(包括监控谁正在执行什么SQL语句)
- 如何测试sql语句性能,提高执行效率
- sql not in 和 not exists (执行效率高)
- 应用Druid监控SQL语句的执行情况
- 怎么分析执行计划来改善 sql效率
- 提高SQL执行效率的几点建议:
- mysql 分析查找执行效率慢的SQL语句
- SQL 语言执行效率经验谈
- SQL执行效率和性能测试方法总结
- 监控Hibernate执行SQL
- JCONSOLE 监控SQL执行情况
- MySQL查看SQL语句执行效率
- 如何测试sql语句性能,提高执行效率
- 如何优化sql语句执行效率
- in和exists的区别与SQL执行效率分析
- SQL语句执行效率及分析(note)