没有合适的资源?快使用搜索试试~ 我知道了~
用p6spy来观察Java程序中执行的所有SQL语句[整理].pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 139 浏览量
2021-10-14
12:52:55
上传
评论
收藏 1.38MB PDF 举报
温馨提示
试读
22页
用p6spy来观察Java程序中执行的所有SQL语句[整理].pdf
资源推荐
资源详情
资源评论
http://tech.ddvip.com/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 的主页是 http://www.p6spy.com ,它支持当前流行的应用服务器,如 JBoss 、
Orion 、Tomcat 、WebLogic 、WebSphere 等,在 http://www.p6spy.com/documentation/i
nstall.htm#install 介绍了 p6spy 的安装。其实不用太在意 p6spy 的安装说明,关键是要
了解了某个应用服务器本身,要搞清楚的一个问题是 “谁在加载 p6spy 包,从哪里加载 ”,
那么配置 p6spy 就不成问题了,你甚至可以把 p6spy 用在独立的 Java 应用程序中。
p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j ,而且还能配搭 SQL Pro
filer 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个优
化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。
原本写这个心里的布局是,先简介 SQL 跟踪,再引入 p6spy ,然后讲讲在 Tomcat
中的配置,最后就是对 p6spy 作少许修改使之更符合自己的输出要求。可是前面一说又说
便打不住了,生出了这许多累赘,那不妨顺势把介绍 p6spy 当成一个系列吧,不得已而把
此编作为引子。下面分篇介绍 Tomcat 中的 p6spy 的配置, p6spy 的定制,必要时加上
与 SQL Profiler 或 IronTrackSQL 的组合使用。
用 p6spy 来观察 Java 程序中执行的所有 SQL
语句(二. Tomcat 下的配置)
本文不打算依照官方的说明来做,我们让 Tomcat 的 Common 类加载器来加载 p6s
py.jar 包,包含了 Tomcat 5/6 下的 p6spy 配置,数据库连接池实现用 C3P0 ,数据库为
Oracle ,配置在一个与应用同名的单独的 xml 文件中, Tomcat 中是在应用的 META-IN
F/context.xml 文件中。步骤如下:
1. 软件准备
下载 Tomcat 5 或者 6 进行安装,不必多说。假设置 Tomcat 的目录为 $TOMCAT
_HOME 。
下载 p6spy-install.zip ,解压缩 p6spy-install.zip ,其中有 p6spy.jar 和 spy.propertie
s
准备好数据库的驱动包,比如 Oracle 的 classes12.jar ,和 C3P0 实现包,如 c3p0-
0.9.0.2.jar 。
2. 拷贝文件
在 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 都拷到 $TOMCA
T_HOME/lib 目录下。
----注:这里我们让 Tomcat 的 Common 类加载器来加载相关类, Common 加载的
类对应 WebApp 是可见的。有关 Tomcat 类加载器层次可参考 Tomcat5 类装载器分析
和 Tomcat6 类装载器分析。
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 目录了。
3. 修改 p6spy 配置文件
打开 $TOMCAT_HOME/lib 或者 $TOMCAT_HOME/common/classes 下的 spy.pro
perties 文件,此文件中本身有很详细的注释,很容易理解其中的配置。我们在这里修改几
个主要的地方,让它能工作起来。
1) 找到 # realdriver=oracle.jdbc.driver.OracleDriver 把前面的 # 注释符去掉,因为
我们用的是 Oracle 数据库,即改为
realdriver=oracle.jdbc.driver.OracleDriver
同时把 realdriver=org.gjt.mm.mysql.Driver 用 # 注释掉,即改为
# realdriver=org.gjt.mm.mysql.Driver
2) 打开输出过滤,因为我们希望对有些表 (如用户表 ) 的查询不输出相应的 SQL ,找
到 filter=false ,把它改为 filter=true 。
再看它后面有几个配置 include = 、 exclude = 和 sqlexpression = 用来设置过
虑规则。例如我们不想输出对 users 、constants 表操作的 SQL ,就配置
exclude = users,constants
3) 输出目的地的选择,在 spy.properties 中可以找到
#specifies the appender to use for logging
#appender=com.p6spy.engine.logging.appender.Log4jLogger
#appender=com.p6spy.engine.logging.appender.StdoutLogger
appender=com.p6spy.engine.logging.appender.FileLogger
分别是输出到 Log4j 、控制台和文件中,如果是输出到控制台的话,就让 appender=c
om.p6spy.engine.logging.appender.StdoutLogger 有效,其他两个注释掉。
如果你配置的是默认的 appender=com.p6spy.engine.logging.appender.FileLogger ,
那么它下面的 logfile = spy.log 就是指定要输出的日志文件, 这个文件会生成在 System.
getProperty("user.dir") 目录中, 即 $TOMCAT_HOME/bin 目录中, 你可以让它生成到 $T
OMCAT_HOME/logs 目录中,就写成
logfile = ../logs/spy.log
如果是让 SQL 语句输出到日志文件的话, append=true ,会较重要,为 true 时为附
加, spy.log 会变得很大,否则为每次 Tomcat 重启后生成新的文件。
需留意一下最后的有关使用 Log4j 输出的配置
4. 配置数据库连接池
其实连接池的配置与使用 p6spy 无多大关系, 无论你是在 Tomcat 中、还是 Spring 、
Hibernate 中配置连接池,甚至是直接用 JDBC 连接数据库都无所谓,关键是,要使 p6s
py 在其中发生效用,所用的数据库驱动就必须是 com.p6spy.engine.spy.P6SpyDriver 。
假定应用的 Context 是 MyWeb ,且直接是部署在 $TOMCAT_HOME/webapps 目录
下,那么我们配置这个应用的数据源就可以在 $TOMCAT_HOME/conf/Catalina/localhost
建立一个 MyWeb.xml 文件,文件内容如下:
<Context path="/MyWeb" docBase="MyWeb"> <!-- 应用放在 $TOMCAT_HOME/w
ebapps/MyWeb 中 -->
<Resource name="jdbc/orads" scope="Shareable" type="com.mchange.v2.
c3p0.ComboPooledDataSource"/>
<ResourceParams name="jdbc/orads"> <!-- 数据源用 java:comp/env/jdbc
/orads 查找 -->
<parameter>
<name>factory</name>
剩余21页未读,继续阅读
资源评论
cyh76339129
- 粉丝: 1
- 资源: 14万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功