一个企业应用程序的性能瓶颈可能会在硬件配置、网络方面、程序代码、应用服务器配置、数据库配置、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/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 的组合使用。
参考:1. 怎样跟踪oracle服务器上正在执行哪些sql语句???
2. 在oracle中怎么查看刚执行的语句???
3. 利用P6SPY +SQL Profiler记录、统计web app对数据库的操作
4. P6Spy + SQL Profiler + IronTrackSQL【修改】
本文链接 https://yanbin.blog/p6spy-view-java-executing-sql-first/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。