![]() |
|
在我?Java 开发应用程序的q程中,隑օ会碰到系l的性能问题Q特别在企业应用的开发过E中Q都会与数据库进行打交道。当我们到数据库性能Ӟ最有效的就是直接跟t每一?SQL 语句的执行情况,SQL 语句的优化、烦引的优化往往也是最Ҏ取得最直接的效果的?/p>
下面Q我们首先开始介l?P6Spy q个剖析工具Q看它是如何无R入性地q行数据库操作的监控与剖析?/p>
P6Spy 是一个可以用来在应用E序中拦截和修改数据操作语句的开源框架。通过 P6Spy 我们可以?SQL 语句q行拦截Q相当于一?SQL 语句的记录器Q这h们可以用它来作相关的分析Q比如性能分析。P6Spy ?Log4J 来记?JDBC 调用的日C息?/p>
自从 2003 q?11 ?30 ?P6Spy 版本 1.3 发布后,已经被下载超q?19,000 ơ了。P6Spy 支持 WebSphere、WebLogic、JBoss、Resin ?Tomcat {绝大多数的应用服务器?/p>
首先Q你的应用系l应当是Z数据库的Q然后你需要去获取 P6Spy 相关的文Ӟ?参考资?/a> 中可以找C载链接,您可以直接下载Y件包Q。下面介l?P6Spy 的安装与使用的详l操作过E:
CLASSPATH
中,如果?Web 应用E序则放?YourWebApp/WEB-INF/lib/
目录下;
CLASSPATH
目录下,如果?Web 应用E序攑֜ YourWebApp/WEB-INF/classess/
目录下,注意不是 lib/
目录
com.p6spy.engine.spy.P6SpyDriver
其它的全部用默认|暂时先都不用修改Q?
realdriver
Q把它的值改Z的应用系l的真正的数据库驱动名称Q?
?P6Spy 发布包中Q它包含 P6Log ?P6Outage 两个模块Q?/p>
P6Log 是用来拦截和记录d应用E序?JDBC 语句的。这个功能对于开发者监?EJB 服务器上?SQL 语句执行情况其有用Q可以让开发者完成尽可能高效的代码。同?P6Spy 的部|是极其单的Q而且Ҏ不需要更改Q何一行代码,卛_现有的应用是无R入性的?/p>
realdriver= (your driver) (你的实际 JDBC 驱动E序名称) executionthreshold=整数旉 (以毫Uؓ单位) |
P6Outage 专门用来和记录执行旉比较长的 SQL 语句QP6Outage 只记录超q配|条仉旉的那些信息,q对可能影响到数据库的运行效率减到最低?/p>
#outagedetection=true|false (是否记录较长旉q行的语? #outagedetectioninterval=整数旉 (以秒为单? |
单地Ԍ我们可以认ؓ P6Spy 是一个代理(ProxyQ,它只做了一层对 JDBC 驱动的拦截,然后转发出去Q这L设计与实际的应用E序没有M的耦合性,除了在配|中驱动程序改?P6Spy 的拦截驱动外Q程序其他地方ƈ不需要做M的改变。这层拦截器除了可能会给pȝ带来略微的性能下降外,对程序其他方面没有Q何的影响。而相对于q一点点的性能下降Q在开发环境中对于开发h员来说是无法感觉刎ͼ相比它所带来的好处,完全可以忽略不计?/p>
?1. P6Spy Ҏ据库q行拦截监控的处理过E?/strong>
如果在你的应用程序启动后Q却?spy.log 文g中发C如下的提CZ息,那就是驱动程序加载先后的问题了?/p>
<你的E序的数据库驱动名称> 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 |
h spy.properties 配置文g里的 deregisterdrivers=false
改ؓ deregisterdrivers=true
Q重新运行即可?/p>
q是因ؓ有些应用pȝ中会先于 P6Spy 加蝲了真正的数据库的驱动E序Q导?P6Spy 无法监控刎ͼ讄 deregisterdrivers
?true
Q是昑ּ地把真正的数据库的驱动程序进行反注册掉,而采?P6Spy 的驱动程序?/p>
下表列出?spy.properties 配置文g中的各配|项的名U、默认值及其意义和相关注意事项Q?/p>
配置名U?/th> | 默认?/th> | 配置Ҏ义及相关注意事项 |
---|---|---|
module.log | com.p6spy.engine.logging. P6LogFactory | 用来拦截和记录Q务应用程序的 JDBC 语句。若无配|或注释掉则无此功能?/td> |
module.outage | com.p6spy.engine.outage. P6OutageFactory | 和记录执行旉比较长的 SQL 语句。若无配|或注释掉则无此功能?/td> |
realdriver | 真正的应用系l用的数据库驱动程序名U?/td> | |
realdriver2 | 真正的应用系l用的W二U备用数据库驱动E序名称?/td> | |
realdriver3 | 真正的应用系l用的W三U备用数据库驱动E序名称?/td> | |
deregisterdrivers | false | 昄地把真正的数据库的驱动程序进行反注册掉。取?true| false |
executionthreshold | P6Log 模块执行旉讄Q整数?(以毫Uؓ单位)Q只有当过q个旉才进行记?Log?/td> | |
outagedetection | false | P6Outage 模块是否记录较长旉q行的语句。取?true| false |
outagedetectioninterval | P6Outage 模块执行旉讄Q整数?Q以Uؓ单位)Q,只有当超q这个时间才q行记录 Log?/td> | |
filter | false | 是否qo LogQ取?true| false |
include | qo Log 时所包含的表名列表,以逗号分隔?/td> | |
exclude | qo Log 时所排除的表名列表,以逗号分隔?/td> | |
sqlexpression | qo Log 时的 SQL 表达式名U?/td> | |
autoflush | true | 是否自动h。取?true| false |
dateformat | 讄旉的格式,也就是用 Java ?SimpleDateFormat E序?/td> | |
includecategories | 昄指定qo Log 时包含的分类列表Q取gؓ errorQinfoQbatchQdebugQstatementQcommitQrollbackQresult 的各U组合?/td> | |
excludecategories | 昄指定qo Log 时排队的分类列表Q取值同上?/td> | |
stringmatcher | 使用正则表达式来qo LogQ取gؓ com.p6spy.engine.common.GnuRegexMatcher ?com.p6spy.engine.common.JakartaRegexMatcher | |
stacktrace | false | 打印堆栈跟踪信息。取?true| false |
stacktraceclass | 如果 stacktrace=trueQ则可以指定具体的类名来q行qo?/td> | |
reloadproperties | false | 监测属性配|文件是否进行重新加载。取?true| false |
reloadpropertiesinterval | 60 | 属性配|文仉新加载的旉间隔Q以Uؓ单位?/td> |
useprefix | false | 是否加上前缀Q设|ؓ trueQ会加上 p6spy: 作ؓ前缀。取?true| false |
appender | com.p6spy.engine.logging. appender.FileLogger | 指定 Log ?appenderQ与 Log4J 有点同义Q取|com.p6spy.engine.logging.appender.Log4jLogger、com.p6spy.engine.logging.appender.StdoutLogger ?com.p6spy.engine.logging.appender.FileLogger |
logfile | spy.log | 指定 Log 的文件名QQ何适于操作pȝ的文件?/td> |
append | true | 指定是否每次是增?LogQ设|ؓ false 则每ơ都会先q行清空。取?true| false |
log4j.appender.STDOUT | org.apache.log4j.ConsoleAppender | ?appender ?log4j 旉用的配置Q配|如?Log4J 的相关配|?/td> |
log4j.appender.STDOUT.layout | org.apache.log4j.PatternLayout | 同上 |
log4j.appender.STDOUT. layout.ConversionPattern | p6spy - %m%n | 同上 |
log4j.logger.p6spy | INFO,STDOUT | Log U别的设|,取值同 Log4J 的配|?/td> |
realdatasource | 讄数据?DataSource 的配|名U?/td> | |
realdatasourceclass | 讄数据?DataSource 的类的全U?/td> | |
realdatasourceproperties | 讄数据?DataSource 的属性,以分号分隔?/td> | |
jndicontextfactory | 讄 JNDI 数据源的 NamingContextFactory?/td> | |
jndicontextproviderurl | 讄 JNDI 数据源的提供者的 URL?/td> | |
jndicontextcustom | 讄 JNDI 数据源的一些定制信息,以分号分隔?/td> |
![]() ![]() |
![]()
|
SQL Profiler 是一个由 Jahia.org 提供的基?P6Spy 引擎的快速剖析工P用来l计 SQL 查询语句以便了解哪里是性能瓉Q在哪里创徏索引或者采取相应的办法才能提高效率Qƈ且能Ҏ SQL 查询语句的情况帮你生成合适的索引脚本?/p>
q个工具可以实时地昄数据库查询的情况Q通过集成?SQL 解析器,在访问大多数表与列上面徏立统计分析,q生成烦引脚本。当Ӟ其它的信息也会进行收集和昄Q比如:单个数据库请求的旉、一c请求的旉以及所有请求的旉。因此,可以有效地通过视图的排序来数据的性能问题所在。这个工具对于大量的需要进行分析的h是非常有用的Q而不是h工一个个地去做分析。当你需要知道比如对相同的表和列q行讉K但是采用不同的查询值时Q这U分l的查询可以用徏立在 ANTLR 上的 SQL 解析器进行分析?/p>
首先Q你的应用系l同样也应当是基于数据库的,然后你需要去获取 SQL Profiler 相关的文Ӟ?参考资?/a> 中可以找C载链接,您可以直接下载Y件包Q。下面介l?SQL Profiler 的安装与使用的详l操作过E:
CLASSPATH
中,如果?Web 应用E序则放?YourWebApp/WEB-INF/lib/
目录下;
CLASSPATH
目录下,如果?Web 应用E序放?YourWebApp/WEB-INF/classess/
目录下,注意不是 lib/
目录Q?
com.p6spy.engine.spy.P6SpyDriver
其它的全部用默认|暂时不用修改Q?
realdriver
的值改Z的程序的数据库驱动名Uͼ
java -jar sqlprofiler.jar
来启?SQL ProfilerQƈ成功看到启动界面Q?
l过一D|间的pȝq行后,点击 Pause 按钮停止拦截Q可以得到分析结果如下图Q?/p>
?2. SQL Profiler 的分析结?Profiler 视图
接着Q可以切换到 Loggers 视图Q这?Lgger 视图的信息:
当然Q也可以切换?Analysis 视图Q这?Analysis 视图的分析结果信息:
在经q分析后Q我们可以直接通过 SQLProfiler 提交的保存按钮,直接导出应当q行数据库优化的的烦引脚本,通过查看索引脚本Q我们可以看到创建烦引的详细 SQL 脚本Q这P我们可以非常方便地q行数据库调优了?/p>
最后一个需要注意的问题是需要先启动 SQLProfilerQ然后再启动应用E序或?Tomcat {应用服务器。这是因?SQLProfiler 默认使用的是 Log4j ?SocketAppenderQ所以要先启动。否则,会因你的应用E序或应用服务器中的 Web 应用之类的因q接不到 Socket 的服务器QSQLProfiler 相当?Socket 的服务器Q而发生错误,可以通过 SQL Profiler 控制界面最下面的连接状态就可以知道是否有程序连接上来?/p>
?5. SQL Profiler 处于非连接状?/strong>
?6. SQL Profiler 处于q接状?/strong>
![]() ![]() |
![]()
|
IronEyeQ一个专注于 JDBC 性能的监控和试的开源项目,它包含有三个工具QIronEye SQLQIronEye CacheQIronTrack SQL。其中,IronEye SQL 用于监测 Java 应用和数据库服务器之间查询开销的时_诊断在性能斚w是否存在着相关问题Q让开发h员在试之前p发现问题。IronEye ?2003 q?10 ?1 日开始基?Apache Software License 发布?/p>
IronEye SQL q个轻量U的 Java 工具提供所有流动在数据库与应用E序之间?SQL l计信息q用多张图表展现Q可以快速优化程序的性能?/p>
IronGrid 相对?Continuous Integration 提出?Continuous Performance 的概念,卛_目开发过E中随时x性能问题Q而不是传l的Z问题再解决的Ҏ?/p>
IronGrid 在应用程序对数据库的操作上的 Continuous Performance 是通过 IronTrack SQL q行体现的。IronTrack SQL 能通过?JDBC 的包装来拦截应用E序Ҏ据库的请求,完成性能监控。IronTrack SQL 的好处在于不需要修改Q何代码或者在数据库端安装ME序Q只需要在试时把依赖?JDBC 替换可以了?/p>
首先Q你的应用系l同样也应当是基于数据库的,然后你需要去获取 IronTrack SQL 相关的文Ӟ?参考资?/a> 中可以找C载链接,您可以直接下载Y件包Q。下面介l?IronTrack SQL 的安装与使用的详l操作过E:
CLASSPATH
中,如果?Web 应用E序则放?YourWebApp/WEB-INF/lib/
目录下;
CLASSPATH
目录下,如果?Web 应用E序放?YourWebApp/WEB-INF/classess/
目录下,注意不是 lib/
目录Q?
com.p6spy.engine.spy.P6SpyDriver
其它的都不用更改Q?
realdriver
Q把它的值改Z的应用系l的真正的数据库驱动名称Q?
monitorport=2000
Q?
java -jar irontracksql.jar
来启?IronTrack SQLQ?
点击“Config”按钮可以设|主机名、端口与h的时_毫秒为单位)。根据你的服务器与端口的不同而进行相应地改变Q下面以本地?2000 端口Q刷新时间ؓ 500 毫秒为示例。设|完成后Q确定,点击“Connect”可以连接应用系lƈq行监测与分析了Q当要停止分析时Q只要点?#8220;Disconnect”按扭卛_立刻停止分析了?/p>
在分析的q程中,我们可以Ҏ需要点?#8220;Purge”按钮Q它可以清除目前所监测到的内容Q然后重新进行记录监信息,很方便地q行重新开始?/p>
?7. IronTrack SQL q接CZ
l过一D|间的pȝq行后,我们可以直接得到分析的结果与相应的图形分析示例。相关的信息昄如下Q?/p>
?8. IronTrack SQL 分析l果
同时也可以通过讄qo条g来显C指定条件的l果Q比如:只关注^均调用次数大?100 ?的结果。点?#8220;Filtering”左边的小三角图标Q可以显C如下的qo条g讄栏目Q?/p>
?9. IronTrack SQL 讄相关的过滤条?/strong>
讄完成后,点击“Apply Filter”按钮卛_以获取所需要的相关l果了。这样可以更加方便地集中_֊q行所需要的内容分析Q可以更加方便快速地定位到问题的所在之处,然后q行解决?/p>
![]() ![]() |
![]()
|
通过使用 P6Spy、SQL Profiler、IronTrack SQL 工具Q我们可以无侵入已有的应用系l而有效地q行数据库操作的监控与剖析,为发现系l的性能瓉Q寻扄l的性能调优提供了相当便利的Ҏ?/p>
exp username/passwork@orcl file=c:\testdb.dmp
exp username/passwork@orcl file=c:\testdb.dmp compress=y
导入Q?/p>
imp username/passwork@orcl file=c:\testdb.dmp full=y