- 浏览: 700126 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (239)
- 系统架构设计 (16)
- java collection framework (2)
- java分布式 (4)
- java多线程 (0)
- 故障处理及调优 (16)
- 软件开发过程及管理 (28)
- OS (5)
- 常用算法 (3)
- design pattern (8)
- transaction (7)
- java apps (48)
- corejava (7)
- java and DB (10)
- cache (0)
- webservice (14)
- web前端 (25)
- 报表 (4)
- 日志系统设计 (3)
- Oracle (4)
- mysql (11)
- xml (11)
- 数据源配置管理 (3)
- 企业数据存储 (4)
- php (2)
- 测试 (1)
最新评论
-
orangebook:
对于初学者来说,这样编写可能会误导,理解更烦锁。
观察者模式(发布-订阅) -
liudajiang:
呵呵 startThreads(rand ...
实践缩小Java synchronized 粒度 -
zengwenbo5566:
谢谢博主,学习了
解决getOutputStream() has already been called for this response -
u011335423:
大神厉害啊 可以了
解决getOutputStream() has already been called for this response -
xiang37:
...
解决getOutputStream() has already been called for this response
俞 黎敏 (mailto:YuLimin@163.com?subject=监控和剖析数据库操作 -- P6Spy、SQL Profiler、IronTrack SQL 使用简介&cc=zoucl@cn.ibm.com), 技术顾问, OCSolutions
2007 年 7 月 30 日
本文介绍如何在应用程序中利用 P6Spy、SQL Profiler、IronTrack SQL 工具来对数据库操作进行监控与剖析,从中发现应用系统存在的性能瓶颈,得到相关的优化建议并最终找到相应的解决办法。
|
在我们 Java 开发应用程序的过程中,难免会碰到系统的性能问题,特别在企业应用的开发过程中,都会与数据库进行打交道。当我们碰到数据库性能时,最有效的就是直接跟踪每一个 SQL 语句的执行情况,SQL 语句的优化、索引的优化往往也是最容易取得最直接的效果的。
下面,我们首先开始介绍 P6Spy 这个剖析工具,看它是如何无侵入性地进行数据库操作的监控与剖析。
P6Spy 是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。P6Spy 用 Log4J 来记录 JDBC 调用的日记信息。
自从 2003 年 11 月 30 日 P6Spy 版本 1.3 发布后,已经被下载超过 19,000 次了。P6Spy 支持 WebSphere、WebLogic、JBoss、Resin 和 Tomcat 等绝大多数的应用服务器。
首先,你的应用系统应当是基于数据库的,然后你需要去获取 P6Spy 相关的文件(在 参考资源 中可以找到下载链接,您可以直接下载软件包)。下面介绍 P6Spy 的安装与使用的详细操作过程:
- 下载 P6Spy 的文件包,也可以下载它的源文件包来研究;
- 把 P6Spy 的 jar 包 p6spy.jar 放到
CLASSPATH
中,如果是 Web 应用程序则放在YourWebApp/WEB-INF/lib/
目录下; - 把 spy.properties 放到
CLASSPATH
目录下,如果是 Web 应用程序放在YourWebApp/WEB-INF/classess/
目录下,注意不是lib/
目录 - 修改你应用系统中的数据库驱动名称为 P6Spy 的驱动程序名称
com.p6spy.engine.spy.P6SpyDriver
其它的全部使用默认值,暂时先都不用修改; - 打开配置文件 spy.properties 文件,找到
realdriver
,把它的值改为你的应用系统的真正的数据库驱动名称; - 运行你的应用程序或 Web 应用程序,可以在 spy.log 里看到 P6Spy 监测到的 SQL 详细的执行与操作的记录信息了,包含有完整的 SQL 执行参数。
在 P6Spy 发布包中,它包含 P6Log 和 P6Outage 两个模块:
- P6Log
P6Log 是用来拦截和记录任务应用程序的 JDBC 语句的。这个功能对于开发者监控 EJB 服务器上的 SQL 语句执行情况尤其有用,可以让开发者完成尽可能高效的代码。同时 P6Spy 的部署是极其简单的,而且根本不需要更改任何一行代码,即对现有的应用是无侵入性的。
realdriver= (your driver) (你的实际 JDBC 驱动程序名称) executionthreshold=整数时间 (以毫秒为单位)
- P6Outage
P6Outage 专门用来检测和记录执行时间比较长的 SQL 语句,P6Outage 只记录超过配置条件里时间的那些信息,并对可能影响到数据库的运行效率减小到最低。
#outagedetection=true|false (是否记录较长时间运行的语句) #outagedetectioninterval=整数时间 (以秒为单位)
简单地讲,我们可以认为 P6Spy 就是一个代理(Proxy),它只做了一层对 JDBC 驱动的拦截,然后转发出去,这样的设计与实际的应用程序没有任何的耦合性,除了在配置中将驱动程序改成 P6Spy 的拦截驱动外,程序其他地方并不需要做任何的改变。这层拦截器除了可能会给系统带来略微的性能下降外,对程序其他方面没有任何的影响。而相对于这一点点的性能下降,在开发环境中对于开发人员来说是无法感觉到,相比它所带来的好处,完全可以忽略不计。
如果在你的应用程序启动后,却在 spy.log 文件中发现了如下的提示信息,那就是驱动程序加载先后的问题了。
<你的程序的数据库驱动名称> is a real driver in spy.properties, but it has been loaded before p6spy. p6spy will not wrap these connections. Either prevent the driver from loading, or try setting'deregisterdrivers' to true in spy.properties |
请把 spy.properties 配置文件里的 deregisterdrivers=false
改为 deregisterdrivers=true
,重新运行即可。
这是因为有些应用系统中会先于 P6Spy 加载了真正的数据库的驱动程序,导致 P6Spy 无法监控到,设置 deregisterdrivers
为 true
,是显式地把真正的数据库的驱动程序进行反注册掉,而采用 P6Spy 的驱动程序。
下表列出了 spy.properties 配置文件中的各配置项的名称、默认值及其意义和相关注意事项:
module.log | com.p6spy.engine.logging. P6LogFactory | 用来拦截和记录任务应用程序的 JDBC 语句。若无配置或注释掉则无此功能。 |
module.outage | com.p6spy.engine.outage. P6OutageFactory | 检测和记录执行时间比较长的 SQL 语句。若无配置或注释掉则无此功能。 |
realdriver | 真正的应用系统使用的数据库驱动程序名称。 | |
realdriver2 | 真正的应用系统使用的第二种备用数据库驱动程序名称。 | |
realdriver3 | 真正的应用系统使用的第三种备用数据库驱动程序名称。 | |
deregisterdrivers | false | 显示地把真正的数据库的驱动程序进行反注册掉。取值 true| false |
executionthreshold | P6Log 模块执行时间设置,整数值 (以毫秒为单位),只有当超过这个时间才进行记录 Log。 | |
outagedetection | false | P6Outage 模块是否记录较长时间运行的语句。取值 true| false |
outagedetectioninterval | P6Outage 模块执行时间设置,整数值 (以秒为单位)),只有当超过这个时间才进行记录 Log。 | |
filter | false | 是否过滤 Log,取值 true| false |
include | 过滤 Log 时所包含的表名列表,以逗号分隔。 | |
exclude | 过滤 Log 时所排除的表名列表,以逗号分隔。 | |
sqlexpression | 过滤 Log 时的 SQL 表达式名称 | |
autoflush | true | 是否自动刷新。取值 true| false |
dateformat | 设置时间的格式,也就是用 Java 的 SimpleDateFormat 程序。 | |
includecategories | 显示指定过滤 Log 时包含的分类列表,取值为 error,info,batch,debug,statement,commit,rollback,result 的各种组合。 | |
excludecategories | 显示指定过滤 Log 时排队的分类列表,取值同上。 | |
stringmatcher | 使用正则表达式来过滤 Log,取值为 com.p6spy.engine.common.GnuRegexMatcher 和 com.p6spy.engine.common.JakartaRegexMatcher | |
stacktrace | false | 打印堆栈跟踪信息。取值 true| false |
stacktraceclass | 如果 stacktrace=true,则可以指定具体的类名来进行过滤。 | |
reloadproperties | false | 监测属性配置文件是否进行重新加载。取值 true| false |
reloadpropertiesinterval | 60 | 属性配置文件重新加载的时间间隔,以秒为单位。 |
useprefix | false | 是否加上前缀,设置为 true,会加上 p6spy: 作为前缀。取值 true| false |
appender | com.p6spy.engine.logging. appender.FileLogger | 指定 Log 的 appender,与 Log4J 有点同义,取值:com.p6spy.engine.logging.appender.Log4jLogger、com.p6spy.engine.logging.appender.StdoutLogger 和 com.p6spy.engine.logging.appender.FileLogger |
logfile | spy.log | 指定 Log 的文件名,任何适于操作系统的文件。 |
append | true | 指定是否每次是增加 Log,设置为 false 则每次都会先进行清空。取值 true| false |
log4j.appender.STDOUT | org.apache.log4j.ConsoleAppender | 当 appender 为 log4j 时采用的配置,配置如同 Log4J 的相关配置。 |
log4j.appender.STDOUT.layout | org.apache.log4j.PatternLayout | 同上 |
log4j.appender.STDOUT. layout.ConversionPattern | p6spy - %m%n | 同上 |
log4j.logger.p6spy | INFO,STDOUT | Log 级别的设置,取值同 Log4J 的配置 |
realdatasource | 设置数据源 DataSource 的配置名称。 | |
realdatasourceclass | 设置数据源 DataSource 的类的全称。 | |
realdatasourceproperties | 设置数据源 DataSource 的属性,以分号分隔。 | |
jndicontextfactory | 设置 JNDI 数据源的 NamingContextFactory。 | |
jndicontextproviderurl | 设置 JNDI 数据源的提供者的 URL。 | |
jndicontextcustom | 设置 JNDI 数据源的一些定制信息,以分号分隔。 |
SQL Profiler 是一个由 Jahia.org 提供的基于 P6Spy 引擎的快速剖析工具,用来统计 SQL 查询语句以便了解哪里是性能瓶颈,在哪里创建索引或者采取相应的办法才能提高效率,并且能根据 SQL 查询语句的情况帮你生成合适的索引脚本。
这个小工具可以实时地显示数据库查询的情况,通过集成的 SQL 解析器,在访问大多数表与列上面建立统计分析,并生成索引脚本。当然,其它的信息也会进行收集和显示,比如:单个数据库请求的时间、一类请求的时间以及所有请求的时间。因此,可以有效地通过视图的排序来检测数据的性能问题所在。这个工具对于大量的需要进行分析的请求是非常有用的,而不是人工一个个地去做分析。当你需要知道比如对相同的表和列进行访问但是采用不同的查询值时,这种分组的查询可以用建立在 ANTLR 上的 SQL 解析器进行分析。
首先,你的应用系统同样也应当是基于数据库的,然后你需要去获取 SQL Profiler 相关的文件(在 参考资源 中可以找到下载链接,您可以直接下载软件包)。下面介绍 SQL Profiler 的安装与使用的详细操作过程:
- 下载 SQL Profiler 的文件包进行安装;
- 把 p6spy.jar 及 sqlprofiler.jar 放到
CLASSPATH
中,如果是 Web 应用程序则放在YourWebApp/WEB-INF/lib/
目录下; - 把 spy.properties 放到
CLASSPATH
目录下,如果是 Web 应用程序就放在YourWebApp/WEB-INF/classess/
目录下,注意不是lib/
目录; - 修改你应用系统中的数据库驱动名称为 P6Spy 的驱动程序名称
com.p6spy.engine.spy.P6SpyDriver
其它的全部使用默认值,暂时不用修改; - 打开 spy.properties 文件,把
realdriver
的值改为你的程序的数据库驱动名称; - 注意要先运行
java -jar sqlprofiler.jar
来启动 SQL Profiler,并成功看到启动界面; - 然后再启动你的应用程序或服务器,并开始进行正常的系统请求处理操作;
- 这样就可以在 SQL Profiler 图形化的界面上看到结果并进行分析了。
经过一段时间的系统运行后,点击 Pause 按钮停止拦截,可以得到分析结果如下图:
接着,可以切换到 Loggers 视图,这是 Lgger 视图的信息:
当然,也可以切换到 Analysis 视图,这是 Analysis 视图的分析结果信息:
在经过分析后,我们可以直接通过 SQLProfiler 提交的保存按钮,直接导出应当进行数据库优化的建议的索引脚本,通过查看索引脚本,我们可以看到创建索引的详细 SQL 脚本,这样,我们就可以非常方便地进行数据库调优了。
最后一个需要注意的问题就是需要先启动 SQLProfiler,然后再启动应用程序或者 Tomcat 等应用服务器。这是因为 SQLProfiler 默认使用的是 Log4j 的 SocketAppender,所以要先启动。否则,会因你的应用程序或应用服务器中的 Web 应用之类的因连接不到 Socket 的服务器(SQLProfiler 相当于 Socket 的服务器)而发生错误,可以通过 SQL Profiler 控制界面最下面的连接状态就可以知道是否有程序连接上来。
IronEye,一个专注于 JDBC 性能的监控和测试的开源项目,它包含有三个工具:IronEye SQL,IronEye Cache,IronTrack SQL。其中,IronEye SQL 用于监测 Java 应用和数据库服务器之间查询开销的时间,诊断在性能方面是否存在着相关问题,让开发人员在测试之前就能发现问题。IronEye 于 2003 年 10 月 1 日开始基于 Apache Software License 发布。
IronEye SQL 这个轻量级的 Java 工具提供所有流动在数据库与应用程序之间的 SQL 统计信息并用多张图表展现,可以快速优化程序的性能。
IronGrid 相对于 Continuous Integration 提出了 Continuous Performance 的概念,即在项目开发过程中随时关注性能问题,而不是传统的出了问题再解决的方案。
IronGrid 在应用程序对数据库的操作上的 Continuous Performance 是通过 IronTrack SQL 进行体现的。IronTrack SQL 能通过对 JDBC 的包装来拦截应用程序对数据库的请求,完成性能监控。IronTrack SQL 的好处在于不需要修改任何代码或者在数据库端安装任何程序,只需要在测试时把依赖的 JDBC 替换就可以了。
首先,你的应用系统同样也应当是基于数据库的,然后你需要去获取 IronTrack SQL 相关的文件(在 参考资源 中可以找到下载链接,您可以直接下载软件包)。下面介绍 IronTrack SQL 的安装与使用的详细操作过程:
- 下载 IronTrack SQL 的文件包进行安装;
- 把 irontracksql.jar, p6spy.jar 和 log4j-1.2.8.jar 放到
CLASSPATH
中,如果是 Web 应用程序则放在YourWebApp/WEB-INF/lib/
目录下; - 把 spy.properties 放到
CLASSPATH
目录下,如果是 Web 应用程序就放在YourWebApp/WEB-INF/classess/
目录下,注意不是lib/
目录; - 修改你程序的数据库驱动名称为 P6Spy 的驱动程序名称
com.p6spy.engine.spy.P6SpyDriver
其它的都不用更改; - 打开配置文件 spy.properties 文件,找到
realdriver
,把它的值改为你的应用系统的真正的数据库驱动名称; - 设置监听端口号
monitorport=2000
; - 先运行
java -jar irontracksql.jar
来启动 IronTrack SQL; - 再启动你的应用程序或服务器;
- 可以在 IronTrack SQL 图形化的界面上看到结果并进行分析了。
点击“Config”按钮就可以设置主机名、端口与刷新的时间(毫秒为单位)。根据你的服务器与端口的不同而进行相应地改变,下面以本地和 2000 端口,刷新时间为 500 毫秒为示例。设置完成后,确定,点击“Connect”就可以连接应用系统并进行监测与分析了,当要停止分析时,只要点击“Disconnect”按扭即可立刻停止分析了。
在分析的过程中,我们可以根据需要点击“Purge”按钮,它可以清除目前所监测到的内容,然后重新进行记录监测信息,很方便地进行重新开始。
经过一段时间的系统运行后,我们可以直接得到分析的结果与相应的图形分析示例。相关的信息显示如下:
Count 列显示 SQL 语句的调用次数;
- Avg Time 列显示 SQL 语句的执行平均时间;
- Max Time 列显示 SQL 语句花费的最高时间;
- SQL 列显示真正执行的 SQL 语句内容。
同时也可以通过设置过滤条件来显示指定条件的结果,比如:只关注平均调用次数大于 100 次 的结果。点击“Filtering”左边的小三角图标,可以显示如下的过滤条件设置栏目:
设置完成后,点击“Apply Filter”按钮即可以获取所需要的相关结果了。这样可以更加方便地集中精力进行所需要的内容分析,可以更加方便快速地定位到问题的所在之处,然后进行解决。
通过使用 P6Spy、SQL Profiler、IronTrack SQL 工具,我们可以无侵入已有的应用系统而有效地进行数据库操作的监控与剖析,为发现系统的性能瓶颈,寻找系统的性能调优提供了相当便利的方法。
学习
- P6Spy 站点:提供数据库性能监控和剖析工具。
- SQL Profiler 站点:提供的基于 P6Spy 引擎的数据库快速剖析工具 SQL Profiler。
- Java 技术专区:寻找 Java 编程各方面的技术文章。
获得产品和技术
- 下载 P6Spy 软件包。
- 下载 SQL Profiler 软件包。
- 下载 IronTrack SQL 软件包。
发表评论
-
java服务,cpu高,内存高,telnet不通排查及分析
2013-12-22 12:29 3095记录上周五的一个java服务的异常排查及分析过程,以备将来 ... -
QPS、PV和需要部署机器数量计算公式
2013-07-31 16:39 1716QPS = req/sec = 请求数/秒 【QPS ... -
java自带监视工具使用_jmap_jhat
2013-07-06 17:50 884jmap命令(Java Memory Map)1.介绍打 ... -
java自带监视工具使用_jps_jstack
2013-07-06 17:32 1863jps命令(Java Virtual Machin ... -
处理OutOfMemoryError: PermGen space
2013-07-06 12:15 1423前两天后台系统内存溢出错误,查看tomcat日志,看到如下 ... -
Heap OOM故障实例2_websphere应用部署
2013-03-20 18:21 2056根据用户需求,将公司 ... -
Heap OOM故障实例1
2013-02-25 15:43 1372故障描述: 线上系统运行过程中出现OOM异常,导致jvm ... -
TCP close_wait内幕
2012-09-07 14:41 1712最近遇到的一个关于socket.close的问题,在某个应用服 ... -
visualVM远程监视安装
2012-08-10 14:44 10941. 通过jstatd启动RMI服务 ... -
tomcat内存配置及项目实践
2010-04-29 16:07 1694最近在做一个数据请求 ... -
利用JProfiler对应用服务器内存泄漏问题诊断一例-2
2009-09-10 17:22 3172实施情况 采用的方案:某某软件商采用了新的会话登录信息 ... -
利用JProfiler对应用服务器内存泄漏问题诊断一例-1
2009-09-10 17:16 1577在中间件应用服务器 ... -
jconsole+tomcat配置说明-3-基于jdk1.5
2009-09-07 16:33 4513Figure 15: List of All Logger N ... -
jconsole+tomcat配置说明-2-基于jdk1.5
2009-09-07 16:18 1729Figure 9: Threads Tab. ... -
jconsole+tomcat配置说明-1-基于jdk1.5
2009-09-07 16:08 2739JConsole是JDK自带的东西,功能虽然没有一些商业软件那 ...
相关推荐
本文将详细介绍P6Spy、SQL Profiler和IronTrack SQL这三个工具,帮助你理解和掌握数据库监控与性能分析的方法。 首先,P6Spy是一个开源的Java库,它允许开发者在不修改应用程序代码的情况下,对数据库访问进行透明...
总结来说,P6Spy和SQLProfiler是数据库管理员和开发者的有力工具,它们可以帮助我们无侵入地监控SQL行为,找出性能瓶颈,从而提升系统整体效率。通过深入理解和正确使用这两个工具,我们可以更好地优化数据库,提高...
总结来说,P6Spy和SqlProfiler是Java开发中不可或缺的数据库监控工具。它们能够帮助我们深入了解应用程序与数据库的交互,从而进行有效的性能优化和问题定位。在日常开发和维护过程中,正确使用这两个工具可以显著...
P6spy和SqlProfiler则是两个用于数据库性能监控和分析的工具。这篇内容将详细解释如何将这三者集成,以提升对数据库操作的监控效率。 【P6spy】 P6spy是一个开源的数据库监控工具,它能够拦截并记录应用程序与...
P6Spy是一款开源的数据库监控工具,主要用于记录和分析应用程序对数据库的所有SQL操作。在Java应用环境中,如WebLogic服务器上,P6Spy可以帮助开发者和DBA监控SQL性能,找出可能存在的瓶颈。本文将详细介绍如何在...
同时,将SQL Profiler和P6Spy结合使用,可以提供更全面的数据库性能监控视图。在Java应用中,P6Spy可以捕获和记录所有的SQL请求,而SQL Profiler则可以在服务器端提供更详细的事件追踪。这种组合可以提供从客户端到...
P6Spy则是一个开源的数据库监控工具,它能够帮助开发者和管理员追踪和分析SQL执行情况,提高数据库性能。SQL Profiler是P6Spy的一个组件,用于对数据库操作进行详细分析,找出潜在的性能瓶颈。 配置WebLogic Server...
2、把p6spy.jar及sqlprofiler.jar放到WEB-INF/lib目录下,将SQL Profiler自带的spy.properties覆盖原来的classes目录下文件 3、修改 原有 JDBC Driver为:com.p6spy.engine.spy.P6SpyDriver其它的都不用更改。 4、...
在IT行业中,数据库操作是应用程序的核心部分,而监控和优化SQL语句的执行效率是数据库管理的...在实际工作中,结合其他数据库监控工具(如MySQL的`EXPLAIN`命令、SQLProfiler等),能更全面地提升数据库的运行效率。
**JDBC SQL日志记录** 是数据库测试中不可或缺的一环,通过P6Spy和SQLProfiler,我们可以收集SQL执行日志,分析执行效率,优化SQL语句,进而提升整体系统的性能。这对于监控数据库健康状况,预防潜在问题,以及在...
这种情况下,使用JDBC SQL Profiler工具能够有效地监控和分析数据库操作,帮助开发者迅速掌握系统数据库设计和业务流程,进而实现二次开发或维护的目标。 JDBC SQL Profiler是一种数据库性能分析工具,它可以监控...
【p6spy简介】 p6spy是一个开源的Java库,设计用于监视和分析应用程序中执行的SQL语句。...后续篇章将更深入地探讨p6spy的定制以及与其他性能监控工具的配合使用,帮助开发者更有效地管理和优化SQL执行。
同时,使用特定数据库监控工具,如P6SPY和SQL Profiler,可以深入分析SQL执行情况,找出性能瓶颈。 在提到的Hibernate3缺点中,一级缓存的强引用问题可能导致内存占用过多。为了解决这个问题,开发者可以适时调用`...
而"Oracle分析函数使用总结.txt"和"SQL Profiler + P6Spy 完全配置手册.txt"则分别涵盖了Oracle的分析函数使用经验及性能监控工具的配置和使用。 总的来说,这个资料集锦为Oracle的学习者提供了一套全面的参考材料...
1. **工具准备**:选用如JVM自带的日志分析、JRockit Mission Control、QuestCentral、p6spy等开源或商业工具进行监控和分析。 2. **设置**:对于数据库,限制连接数,确保测试数据足够;对于应用服务器,设置最小...