2024年5月25日发(作者:章凝雁)
/?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 的主页是 ,它支持当前流行的应用服务器,如 JBos
s、Orion、Tomcat、WebLogic、WebSphere 等,在 /docum
entation/#install 介绍了 p6spy 的安装。其实不用太在意 p6spy 的安装说
明,关键是要了解了某个应用服务器本身,要搞清楚的一个问题是“谁在加载 p6spy 包,
从哪里加载”,那么配置 p6spy 就不成问题了,你甚至可以把 p6spy 用在独立的 Java
应用程序中。
p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Pr
ofiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个
优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。
原本写这个心里的布局是,先简介 SQL 跟踪,再引入 p6spy,然后讲讲在 Tomcat
中的配置,最后就是对 p6spy 作少许修改使之更符合自己的输出要求。可是前面一说又
说便打不住了,生出了这许多累赘,那不妨顺势把介绍 p6spy 当成一个系列吧,不得已
而把此编作为引子。下面分篇介绍 Tomcat 中的 p6spy 的配置,p6spy 的定制,必要
时加上与 SQL Profiler 或 IronTrackSQL 的组合使用。
用 p6spy 来观察 Java 程序中执行的所有 SQL 语句(二. Tomcat 下的配置)
本文不打算依照官方的说明来做,我们让 Tomcat 的 Common 类加载器来加载 p
包,包含了 Tomcat 5/6 下的 p6spy 配置,数据库连接池实现用 C3P0,数据
库为 Oracle,配置在一个与应用同名的单独的 xml 文件中,Tomcat 中是在应用的 ME
TA-INF/ 文件中。步骤如下:
1. 软件准备
2024年5月25日发(作者:章凝雁)
/?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 的主页是 ,它支持当前流行的应用服务器,如 JBos
s、Orion、Tomcat、WebLogic、WebSphere 等,在 /docum
entation/#install 介绍了 p6spy 的安装。其实不用太在意 p6spy 的安装说
明,关键是要了解了某个应用服务器本身,要搞清楚的一个问题是“谁在加载 p6spy 包,
从哪里加载”,那么配置 p6spy 就不成问题了,你甚至可以把 p6spy 用在独立的 Java
应用程序中。
p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Pr
ofiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个
优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。
原本写这个心里的布局是,先简介 SQL 跟踪,再引入 p6spy,然后讲讲在 Tomcat
中的配置,最后就是对 p6spy 作少许修改使之更符合自己的输出要求。可是前面一说又
说便打不住了,生出了这许多累赘,那不妨顺势把介绍 p6spy 当成一个系列吧,不得已
而把此编作为引子。下面分篇介绍 Tomcat 中的 p6spy 的配置,p6spy 的定制,必要
时加上与 SQL Profiler 或 IronTrackSQL 的组合使用。
用 p6spy 来观察 Java 程序中执行的所有 SQL 语句(二. Tomcat 下的配置)
本文不打算依照官方的说明来做,我们让 Tomcat 的 Common 类加载器来加载 p
包,包含了 Tomcat 5/6 下的 p6spy 配置,数据库连接池实现用 C3P0,数据
库为 Oracle,配置在一个与应用同名的单独的 xml 文件中,Tomcat 中是在应用的 ME
TA-INF/ 文件中。步骤如下:
1. 软件准备