|
<!----><!---->
<!---->
|
俞 黎敏 (YuLimin@163.com), 技术顾问
2007 年 7 月 30 日
本文介绍如何在应用程序中利用 P6Spy、SQL Profiler、IronTrack SQL 工具来对数据库操作进行监控与剖析,从中发现应用系统存在的性能瓶颈,得到相关的优化建议并最终找到相应的解决办法。
|
几乎 80% - 85% 的数据库性能问题是由于应用数据库的设计或者应用程序本身的代码所引起的。因此良好的事务处理能力需要在设计应用程序的时候,在设计数据库的时候就考虑到性能和伸缩性。
---- DB2 Magazine
|
|
在我们 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 的拦截驱动外,程序其他地方并不需要做任何的改变。这层拦截器除了可能会给系统带来略微的性能下降外,对程序其他方面没有任何的影响。而相对于这一点点的性能下降,在开发环境中对于开发人员来说是无法感觉到,相比它所带来的好处,完全可以忽略不计。
图 1. P6Spy 对数据库进行拦截监控的处理过程
问题与解决
如果在你的应用程序启动后,却在 spy.log 文件中发现了如下的提示信息,那就是驱动程序加载先后的问题了。
<你的程序的数据库驱动名称> is a real driver in spy.properties, but it has
been loaded before p6spy. p6spy will not wrap these connections. Either
prevent the driver from loading, or try setting'deregisterdrivers' to true in
spy.properties
|
请把 spy.properties 配置文件里的 deregisterdrivers=false
改为 deregisterdrivers=true
,重新运行即可。
这是因为有些应用系统中会先于 P6Spy 加载了真正的数据库的驱动程序,导致 P6Spy 无法监控到,设置 deregisterdrivers
为 true
,是显式地把真正的数据库的驱动程序进行反注册掉,而采用 P6Spy 的驱动程序。
配置参数及相关意义
下表列出了 spy.properties 配置文件中的各配置项的名称、默认值及其意义和相关注意事项:
配置项名称
默认值
配置项意义及相关注意事项
module.log |
com.p6spy.engine.logging. P6LogFactory |
用来拦截和记录任务应用程序的 JDBC 语句。若无配置或注释掉则无此功能。 |
module.outage |
com.p6spy.engine.outage. P6OutageFactory |
检测和记录执行时间比较长的 SQL 语句。若无配置或注释掉则无此功能。 |
realdriver |
|
真正的应用系统使用的数据库驱动程序名称。 |
realdriver2 |
|
真正的应用系统使用的第二种备用数据库驱动程序名称。 |
realdriver3 |
|
真正的应用系统使用的第三种备用数据库驱动程序名称。 |
deregisterdrivers |
false |
显示地把真正的数据库的驱动程序进行反注册掉。取值 true| false |
executionthreshold |
|
P6Log 模块执行时间设置,整数值 (以毫秒为单位),只有当超过这个时间才进行记录 Log。 |
outagedetection |
false |
P6Outage 模块是否记录较长时间运行的语句。取值 true| false |
outagedetectioninterval |
|
P6Outage 模块执行时间设置,整数值 (以秒为单位)),只有当超过这个时间才进行记录 Log。 |
filter |
false |
是否过滤 Log,取值 true| false |
include |
|
过滤 Log 时所包含的表名列表,以逗号分隔。 |
exclude |
|
过滤 Log 时所排除的表名列表,以逗号分隔。 |
sqlexpression |
|
过滤 Log 时的 SQL 表达式名称 |
autoflush |
true |
是否自动刷新。取值 true| false |
dateformat |
|
设置时间的格式,也就是用 Java 的 SimpleDateFormat 程序。 |
includecategories |
|
显示指定过滤 Log 时包含的分类列表,取值为 error,info,batch,debug,statement,commit,rollback,result 的各种组合。 |
excludecategories |
|
显示指定过滤 Log 时排队的分类列表,取值同上。 |
stringmatcher |
|
使用正则表达式来过滤 Log,取值为 com.p6spy.engine.common.GnuRegexMatcher 和 com.p6spy.engine.common.JakartaRegexMatcher |
stacktrace |
false |
打印堆栈跟踪信息。取值 true| false |
stacktraceclass |
|
如果 stacktrace=true,则可以指定具体的类名来进行过滤。 |
reloadproperties |
false |
监测属性配置文件是否进行重新加载。取值 true| false |
reloadpropertiesinterval |
60 |
属性配置文件重新加载的时间间隔,以秒为单位。 |
useprefix |
false |
是否加上前缀,设置为 true,会加上 p6spy: 作为前缀。取值 true| false |
appender |
com.p6spy.engine.logging. appender.FileLogger |
指定 Log 的 appender,与 Log4J 有点同义,取值:com.p6spy.engine.logging.appender.Log4jLogger、com.p6spy.engine.logging.appender.StdoutLogger 和 com.p6spy.engine.logging.appender.FileLogger |
logfile |
spy.log |
指定 Log 的文件名,任何适于操作系统的文件。 |
append |
true |
指定是否每次是增加 Log,设置为 false 则每次都会先进行清空。取值 true| false |
log4j.appender.STDOUT |
org.apache.log4j.ConsoleAppender |
当 appender 为 log4j 时采用的配置,配置如同 Log4J 的相关配置。 |
log4j.appender.STDOUT.layout |
org.apache.log4j.PatternLayout |
同上 |
log4j.appender.STDOUT. layout.ConversionPattern |
p6spy - %m%n |
同上 |
log4j.logger.p6spy |
INFO,STDOUT |
Log 级别的设置,取值同 Log4J 的配置 |
realdatasource |
|
设置数据源 DataSource 的配置名称。 |
realdatasourceclass |
|
设置数据源 DataSource 的类的全称。 |
realdatasourceproperties |
|
设置数据源 DataSource 的属性,以分号分隔。 |
jndicontextfactory |
|
设置 JNDI 数据源的 NamingContextFactory。 |
jndicontextproviderurl |
|
设置 JNDI 数据源的提供者的 URL。 |
jndicontextcustom |
|
设置 JNDI 数据源的一些定制信息,以分号分隔。 |
|
|
SQL Profiler
SQL Profiler 是一个由 Jahia.org 提供的基于 P6Spy 引擎的快速剖析工具,用来统计 SQL 查询语句以便了解哪里是性能瓶颈,在哪里创建索引或者采取相应的办法才能提高效率,并且能根据 SQL 查询语句的情况帮你生成合适的索引脚本。
这个小工具可以实时地显示数据库查询的情况,通过集成的 SQL 解析器,在访问大多数表与列上面建立统计分析,并生成索引脚本。当然,其它的信息也会进行收集和显示,比如:单个数据库请求的时间、一类请求的时间以及所有请求的时间。因此,可以有效地通过视图的排序来检测数据的性能问题所在。这个工具对于大量的需要进行分析的请求是非常有用的,而不是人工一个个地去做分析。当你需要知道比如对相同的表和列进行访问但是采用不同的查询值时,这种分组的查询可以用建立在 ANTLR 上的 SQL 解析器进行分析。
使用步骤
首先,你的应用系统同样也应当是基于数据库的,然后你需要去获取 SQL Profiler 相关的文件(在 参考资源 中可以找到下载链接,您可以直接下载软件包)。下面介绍 SQL Profiler 的安装与使用的详细操作过程:
- 下载 SQL Profiler 的文件包进行安装;
- 把 p6spy.jar 及 sqlprofiler.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
的值改为你的程序的数据库驱动名称;
- 注意要先运行
java -jar sqlprofiler.jar
来启动 SQL Profiler,并成功看到启动界面;
- 然后再启动你的应用程序或服务器,并开始进行正常的系统请求处理操作;
- 这样就可以在 SQL Profiler 图形化的界面上看到结果并进行分析了。
分析结果
经过一段时间的系统运行后,点击 Pause 按钮停止拦截,可以得到分析结果如下图:
图 2. SQL Profiler 的分析结果 Profiler 视图
接着,可以切换到 Loggers 视图,这是 Lgger 视图的信息:
图 3. SQL Profiler 的分析结果 Logger 视图
当然,也可以切换到 Analysis 视图,这是 Analysis 视图的分析结果信息:
图 4. SQL Profiler 的分析结果 Analysis 视图
在经过分析后,我们可以直接通过 SQLProfiler 提交的保存按钮,直接导出应当进行数据库优化的建议的索引脚本,通过查看索引脚本,我们可以看到创建索引的详细 SQL 脚本,这样,我们就可以非常方便地进行数据库调优了。
问题与解决
最后一个需要注意的问题就是需要先启动 SQLProfiler,然后再启动应用程序或者 Tomcat 等应用服务器。这是因为 SQLProfiler 默认使用的是 Log4j 的 SocketAppender,所以要先启动。否则,会因你的应用程序或应用服务器中的 Web 应用之类的因连接不到 Socket 的服务器(SQLProfiler 相当于 Socket 的服务器)而发生错误,可以通过 SQL Profiler 控制界面最下面的连接状态就可以知道是否有程序连接上来。
图 5. SQL Profiler 处于非连接状态
图 6. SQL Profiler 处于连接状态
#dateformat=yyyy-MM-dd HH:mm:ss:SS p6spy 显示时间格式
分享到:
相关推荐
监控和剖析数据库 P6Spy、SQL Profiler、IronTrack SQL。三个东东打包放送,另附配置说明
p6spy-sql监控 p6spy-sql监控 p6spy-sql监控
用p6spy+sqlprofiler 监控sql 的所有文件和包
专门用来监控hibernate的sql输出,进行调试应用程序的工具,找了好久才找到,里面有个配置文件,记住realdriver是你的驱动,而在hibernate设置的驱动是这个驱动代理,p6spy的驱动,相当于在hibernate和数据库之间放...
p6spy和sqlProfiler的配合使用让你的hibernate的show_sql更好用 p6spy和sqlProfiler的配合使用让你的hibernate的show_sql更好用 p6spy和sqlProfiler的配合使用让你的hibernate的show_sql更好用
利用P6SPY +SQL Profiler调试、记录、统计web app对数据库的操作, 可以查看到PreparedStatment的执行最终的SQL语句。 有详细的操作说明 下面的这个是集成的完整版。。太大了就不上传了。自己下吧 jahia_v6_...
配置P6Spy和SQL Profiler
p6spy.jar 博文链接:https://lxy19791111.iteye.com/blog/131293
通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。P6Spy 用 Log4J 来记录 JDBC 调用的日记信息。 自从 2003 年 11 月 30 日 P6Spy 版本 1.3 ...
结合SQL Profiler进行图形化监控与使用 1、下载SQL Profiler的文件包进行安装。 2、把p6spy.jar及sqlprofiler.jar放到WEB-INF/lib目录下,将SQL Profiler自带的spy.properties覆盖原来的classes目录下文件 3、修改 ...
P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。 p6spy的安装步骤: 1. 下载p6spy的安装包 2. 把p6spy的jar包放到Classpath中,如果是WEB App...
NULL 博文链接:https://cuisuqiang.iteye.com/blog/2067027
对p6spy的使用做了些简化,其实主要目的有两个:1是为了学习p6spy的源码,2是简化使用方法,使一些非开发人员也能使用此工具监听sql,压缩包内附源码和说明文档
NULL 博文链接:https://zhupan.iteye.com/blog/26414
内含p6spy-3.6.0.zip,p6spy最新Hibernate和Mybatis拦截并格式化sql配置.txt两个文件,用于调试监控项目运行状态,亲测可用,测试整理出来花了我很长时间的,好用不可多得!
p6spy-spring-boot-starter p6spy弹簧启动器说明基于p6spy的Spring Boot Starter实现玛文< dependency>< groupId>com.github.hiwepy</ groupId>< artifactId>p6spy-spring-boot-starter</ artifactId>< version>${...
p6spy简介,p6spy完整显示hibernate的SQL语句 包括参数,spring p6spy 配置
NULL 博文链接:https://cometzb-xujun.iteye.com/blog/1961262
NULL 博文链接:https://duqiangcise.iteye.com/blog/1861137