如何确定导致Oracle CPU峰值的SQL

我有一个使用Oracle 11g进行持久化的J2EE Spring / Hibernate Web应用程序,偶尔会产生Oracle CPU高达100%的使用率,重新启动Tomcat将释放Oracle CPU。 我无法复制这个testing,甚至使用生产出口。 有无论如何有甲骨文显示我的SQL语句导致穗? 还是有另一种方法,我可以采取这将帮助我找出问题的地方?

其他信息:Webapp和Oracle在不同的盒子(两个窗口)。 通过SSL使用JDBC

谢谢。

当生产达到100%的CPU时,你(或你的DBA)可以运行“top”命令,获取对CPU贡献最大的进程ID(假设你只有其中的几个),然后使用下面的查询来捕获会话那当时在做什么:

selectp.SPID UnixProcess,s.SID,s.serial#,s.USERNAME,s.COMMAND,s.MACHINE,s.SQL_ADDRESS,s.SQL_HASH_VALUE,s.program,status,cpu_time,fetches,disk_reads,buffer_gets,rows_processed ,执行,child_latch,事件,sql_text,来自gv的COMMAND_TYPE $ session s左外连接gv $进程p上p.ADDR = s.PADDR和s.inst_id = p.inst_id左外连接gv $ sqlarea sa上sa.ADDRESS = s.SQL_ADDRESS和s.inst_id = sa.inst_id其中p.spid =

您可以在数据库上启用性能跟踪,并使用一些内置实用程序监视查询的执行情况。

我个人还没有在Oracle上这样做,但他们确实有在线文档来指导你正确的方向。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/sqltrace.htm#sthref2019

你应该确实检查你的servlet生命周期,你正确地closures你的数据库连接,并且你在servlet上使用的对象被正确地垃圾收集。 有时在servlet上可能会有一些非常棘手的内存泄漏,如果您使用的是某种DI框架,甚至会更多。

一个是我正在被垃圾收集的servlet上发生内存泄漏,但是当为另一个应用程序做一些RMI时,代理对象没有被收集,所以我的空闲内存吃光了。

看看这篇关于在servlet上进行性能testing和内存检查的技巧。

http://www.ibm.com/developerworks/rational/library/2820.html