在我们 Java 开发应用程序的过程中,难免会碰到系统的性能问题,特别在企业应用的开发过程中,都会与数据库进行打交道。当我们碰到数据库性能时,最有效的就是直接跟踪每一个 SQL 语句的执行情况,SQL 语句的优化、索引的优化往往也是最容易取得最直接的效果的。
下面,我们首先开始介绍 P6Spy 这个剖析工具,看它是如何无侵入性地进行数据库操作的监控与剖析。
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 执行参数。
P6Log与 P6Outage
在 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 的拦截驱动外,程序其他地方并不需要做任何的改变。这层拦截器除了可能会给系统带来略微的性能下降外,对程序其他方面没有任何的影响。而相对于这一点点的性能下降,在开发环境中对于开发人员来说是无法感觉到,相比它所带来的好处,完全可以忽略不计。