在咱们 Java 开发应用程序的过程当中,不免会碰到系统的性能问题,特别在企业应用的开发过程当中,都会与数据库进行打交道。当咱们碰到数据库性能时,最有效的就是直接跟踪每个 SQL 语句的执行状况,SQL 语句的优化、索引的优化每每也是最容易取得最直接的效果的。 html
下面,咱们首先开始介绍 P6Spy 这个剖析工具,看它是如何无侵入性地进行数据库操做的监控与剖析。 java
P6Spy 正则表达式
P6Spy 是一个能够用来在应用程序中拦截和修改数据操做语句的开源框架。经过 P6Spy 咱们能够对 SQL 语句进行拦截,至关于一个 SQL 语句的记录器,这样咱们能够用它来做相关的分析,好比性能分析。P6Spy 用 Log4J 来记录 JDBC 调用的日记信息。 sql
自从 2003 年 11 月 30 日 P6Spy 版本 1.3 发布后,已经被下载超过 19,000 次了。P6Spy 支持 WebSphere、WebLogic、JBoss、Resin 和 Tomcat 等绝大多数的应用服务器。 数据库
使用步骤 express
首先,你的应用系统应当是基于数据库的,而后你须要去获取 P6Spy 相关的文件(在 参考资源 中能够找到下载连接,您能够直接下载软件包)。下面介绍 P6Spy 的安装与使用的详细操做过程: apache
CLASSPATH
中,若是是 Web 应用程序则放在 YourWebApp/WEB-INF/lib/
目录下; CLASSPATH
目录下,若是是 Web 应用程序放在 YourWebApp/WEB-INF/classess/
目录下,注意不是lib/
目录 com.p6spy.engine.spy.P6SpyDriver
其它的所有使用默认值,暂时先都不用修改; realdriver
,把它的值改成你的应用系统的真正的数据库驱动名称; P6Log 与 P6Outage 编程
在 P6Spy 发布包中,它包含 P6Log 和 P6Outage 两个模块: 服务器
P6Log 是用来拦截和记录任务应用程序的 JDBC 语句的。这个功能对于开发者监控 EJB 服务器上的 SQL 语句执行状况尤为有用,可让开发者完成尽量高效的代码。同时 P6Spy 的部署是极其简单的,并且根本不须要更改任何一行代码,即对现有的应用是无侵入性的。 架构
realdriver= (your driver) (你的实际 JDBC 驱动程序名称) executionthreshold=整数时间 (以毫秒为单位) |
P6Outage 专门用来检测和记录执行时间比较长的 SQL 语句,P6Outage 只记录超过配置条件里时间的那些信息,并对可能影响到数据库的运行效率减少到最低。
#outagedetection=true|false (是否记录较长时间运行的语句) #outagedetectioninterval=整数时间 (以秒为单位) |
架构原理
简单地讲,咱们能够认为 P6Spy 就是一个代理(Proxy),它只作了一层对 JDBC 驱动的拦截,而后转发出去,这样的设计与实际的应用程序没有任何的耦合性,除了在配置中将驱动程序改为 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 的安装与使用的详细操做过程:
CLASSPATH
中,若是是 Web 应用程序则放在 YourWebApp/WEB-INF/lib/
目录下; CLASSPATH
目录下,若是是 Web 应用程序就放在 YourWebApp/WEB-INF/classess/
目录下,注意不是lib/
目录; com.p6spy.engine.spy.P6SpyDriver
其它的所有使用默认值,暂时不用修改; realdriver
的值改成你的程序的数据库驱动名称; java -jar sqlprofiler.jar
来启动 SQL Profiler,并成功看到启动界面; 分析结果
通过一段时间的系统运行后,点击 Pause 按钮中止拦截,能够获得分析结果以下图:
接着,能够切换到 Loggers 视图,这是 Lgger 视图的信息:
固然,也能够切换到 Analysis 视图,这是 Analysis 视图的分析结果信息:
在通过分析后,咱们能够直接经过 SQLProfiler 提交的保存按钮,直接导出应当进行数据库优化的建议的索引脚本,经过查看索引脚本,咱们能够看到建立索引的详细 SQL 脚本,这样,咱们就能够很是方便地进行数据库调优了。
最后一个须要注意的问题就是须要先启动 SQLProfiler,而后再启动应用程序或者 Tomcat 等应用服务器。这是由于 SQLProfiler 默认使用的是 Log4j 的 SocketAppender,因此要先启动。不然,会因你的应用程序或应用服务器中的 Web 应用之类的因链接不到 Socket 的服务器(SQLProfiler 至关于 Socket 的服务器)而发生错误,能够经过 SQL Profiler 控制界面最下面的链接状态就能够知道是否有程序链接上来。
IronTrack SQL
IronEye,一个专一于 JDBC 性能的监控和测试的开源项目,它包含有三个工具:IronEye SQL,IronEye Cache,IronTrack SQL。其中,IronEye SQL 用于监测 Java 应用和数据库服务器之间查询开销的时间,诊断在性能方面是否存在着相关问题,让开发人员在测试以前就能发现问题。IronEye 于 2003 年 10 月 1 日开始基于 Apache Software License 发布。
IronEye SQL 这个轻量级的 Java 工具提供全部流动在数据库与应用程序之间的 SQL 统计信息并用多张图表展示,能够快速优化程序的性能。
IronGrid 相对于 Continuous Integration 提出了 Continuous Performance 的概念,即在项目开发过程当中随时关注性能问题,而不是传统的出了问题再解决的方案。
IronGrid 在应用程序对数据库的操做上的 Continuous Performance 是经过 IronTrack SQL 进行体现的。IronTrack SQL 能经过对 JDBC 的包装来拦截应用程序对数据库的请求,完成性能监控。IronTrack SQL 的好处在于不须要修改任何代码或者在数据库端安装任何程序,只须要在测试时把依赖的 JDBC 替换就能够了。
使用步骤
首先,你的应用系统一样也应当是基于数据库的,而后你须要去获取 IronTrack SQL 相关的文件(在 参考资源 中能够找到下载连接,您能够直接下载软件包)。下面介绍 IronTrack SQL 的安装与使用的详细操做过程:
CLASSPATH
中,若是是 Web 应用程序则放在 YourWebApp/WEB-INF/lib/
目录下; CLASSPATH
目录下,若是是 Web 应用程序就放在 YourWebApp/WEB-INF/classess/
目录下,注意不是lib/
目录; com.p6spy.engine.spy.P6SpyDriver
其它的都不用更改; realdriver
,把它的值改成你的应用系统的真正的数据库驱动名称; monitorport=2000
; java -jar irontracksql.jar
来启动 IronTrack SQL; 链接设置
点击“Config”按钮就能够设置主机名、端口与刷新的时间(毫秒为单位)。根据你的服务器与端口的不一样而进行相应地改变,下面以本地和 2000 端口,刷新时间为 500 毫秒为示例。设置完成后,肯定,点击“Connect”就能够链接应用系统并进行监测与分析了,当要中止分析时,只要点击“Disconnect”按扭便可马上中止分析了。
在分析的过程当中,咱们能够根据须要点击“Purge”按钮,它能够清除目前所监测到的内容,而后从新进行记录监测信息,很方便地进行从新开始。
分析结果
通过一段时间的系统运行后,咱们能够直接获得分析的结果与相应的图形分析示例。相关的信息显示以下:
同时也能够经过设置过滤条件来显示指定条件的结果,好比:只关注平均调用次数大于 100 次 的结果。点击“Filtering”左边的小三角图标,能够显示以下的过滤条件设置栏目:
设置完成后,点击“Apply Filter”按钮便可以获取所须要的相关结果了。这样能够更加方便地集中精力进行所须要的内容分析,能够更加方便快速地定位到问题的所在之处,而后进行解决。
总结
经过使用 P6Spy、SQL Profiler、IronTrack SQL 工具,咱们能够无侵入已有的应用系统而有效地进行数据库操做的监控与剖析,为发现系统的性能瓶颈,寻找系统的性能调优提供了至关便利的方法。
参考资料
学习
得到产品和技术