tech.ddvip/result.php?key=p6spy
用 p6spy 来观察 Java 程序中执行的所有 SQL 语句(一. 引子)
一个企业应用程序的性能瓶颈可能会在硬件配置、网络方面、程序代码、应用服务器配置、数据库配置、SQL 语句。这里我把本文的关注点 SQL 无意间放在了最后,其实它不并不意味着最后考虑的,而是过程中就要时刻留意的。
SQL 语句的优化总得把所执行语句抓出来瞧瞧,分析分析。如果直接用 JDBC 或者是类 iBatis 的东西来访问数据库,那所执行的 SQL 语句是明确的,而现在的项目大多会用 ORM 组件,例如 Hibernate、JPA、CMP、TopLink 都有自己特定的查询语法,最终当然要转换成 SQL 语句的,所以会生成什么样的 SQL 语句就不甚明了,若人为的看着专有查询语句来相象出 SQL 语句并非易事。虽然 Hibernate 设置 show_sql=true 时也能打印出生成的 SQL(带?号参数),配合详细的日志参数值也可以对上,不过挺麻烦的。
许多数据库本身就有 SQL 语句的跟踪功能。比如 Oracle 中,可以为某个用户开启 SQL 跟踪功能,根据条件把所执行的 SQL 语句记录在服务器的日志。或者可从 v$sql、v$sqltext、v$sqlarea 等视图中去查询所执行的 SQL 语句。
利用数据库的 SQL 功能需用特定于数据库的配置方法,好处就是不拘泥于某种编程语言。对于 Java 程序我们介绍 p6spy 组件,它可以拦截所有执行的 SQL 语句,而不管你使用的是什么 ORM 框架。对于 PrepareStatement 那样带参数(?) 的语句,它会帮你代上相应的参数值。
p6spy 的主页是 www.p6spy,它支持当前流行的应用服务器,如 JBoss、Orion、Tomcat、WebLogic、WebSphere 等,在 www.p6spy/documentation/install.htm#install 介绍了 p6spy 的安装。其实不用太在意 p6spy 的安装说明,关键是要了解了某个应用服务器本身,要搞清楚的一个问题是“谁在加载 p6spy 包,从哪里加载”,那么配置 p6spy 就不成问题了,你甚至可以把 p6spy 用在独立的 Java 应用程序中。
p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Profiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。
原本写这个心里的布局是,先简介 SQL 跟踪,再引入 p6spy,然后讲讲在 Tomcat 中的
配置,最后就是对 p6spy 作少许修改使之更符合自己的输出要求。可是前面一说又说便打不住了,生出了这许多累赘,那不妨顺势把介绍 p6spy 当成一个系列吧,不得已而把此编作为引子。下面分篇介绍 Tomcat 中的 p6spy 的配置,p6spy 的定制,必要时加上与 SQL Profiler 或 IronTrackSQL 的组合使用。
用 p6spy 来观察 Java 程序中执行的所有 SQL 语句(二. Tomcat 下的配置)
本文不打算依照官方的说明来做,我们让 Tomcat 的 Common 类加载器来加载 p6spy.jar 包,包含了 Tomcat 5/6 下的 p6spy 配置,数据库连接池实现用 C3P0,数据库为 Oracle,配置在一个与应用同名的单独的 xml 文件中,Tomcat 中是在应用的 l 文件中。步骤如下:
1. 软件准备
下载 Tomcat 5 或者 6 进行安装,不必多说。假设置 Tomcat 的目录为 $TOMCAT_HOME。
下载 p6spy-install.zip,解压缩 p6spy-install.zip,其中有 p6spy.jar 和 spy.properties
准备好数据库的驱动包,比如 Oracle 的 classes12.jar,和 C3P0 实现包,如 c3p0-0.9.0.2.jar。
2. 拷贝文件
mysql下载的zip版本安装步骤 在 Tomcat 5 下:
拷贝 p6spy.jar、classes12.jar、c3p0-0.9.0.2.jar 到 $TOMCAT_HOME/common/lib 目录下
拷贝 spy.properties 到 $TOMCAT_HOME/common/classes 目录下
在 Tomcat 6 下:
把 p6spy.jar、classes12.jar、c3p0-0.9.0.2.jar 和 spy.properties 都拷到 $TOMCAT_HOME/lib 目录下。
----注:这里我们让 Tomcat 的 Common 类加载器来加载相关类,Common 加载的类对应 WebApp 是可见的。有关 Tomcat 类加载器层次可参考 Tomcat5 类装载器分析 和 Tomca
t6 类装载器分析。
Tomcat5 的 Common 类加载器从 $TOMCAT_HOME/common/lib 目录下加载 jar/zip 文件,从 $TOMCAT_HOME/common/classes 下加载类文件。而 spy.properties 是通过 classloader 来加载的,所以应放在 classpath 下。而 Tomcat 6 的 Common 类加载器对 jar/zip,和 class 文件都是从 $TOMCAT_HOME/lib 中加载。
细心点还能注意到 Tomcat 5.5.20 是 Tomcat 5 到 Tomcat 6 的过度版本,实则是一个混乱的版本。同时有 $TOMCAT_HOME/lib 和 $TOMCAT_HOME/common 目录,可是又新奇的发现在 Tomcat 5.5.25 中没有 $TOMCAT_HOME/lib 目录了。Tomcat 6 中不再有 $TOMCAT_HOME/common 目录了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论