<%@ page contentType="text/html; charset=gb2312"%> 获得应用程序所执行的sql语句
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
获得应用程序所执行的sql语句
     发布者: 发布时间:2006-05-07
我们在确定应用程序性能的时候,更多地会关注其中sql语句的执行情况。通常应用的性能瓶颈会在数据库这边,因此数据库的sql语句是我们优化的重点。

    要对sql语句进行优化,首先要知道应用程序执行了哪些sql语句。下面我介绍三种方法来获得应用程序所执行的sql语句。


方法一:如果你采用的数据库是oracle的话,那么可以利用oracle本身的10046事件跟踪sql语句。步骤如下:

1、首先获得spid、sid、serial#,machine为你的机器名


sql> select b.spid,a.sid,a.serial#,a.machine from v$session a,v$process b where a.paddr = b.addr and a.machine=''yz'';
 
spid                sid    serial#  machine

9497                 49       3406     yz


2、利用10046事件开始跟踪


sql>execute sys.dbms_system.set_ev(49, 3406,10046,1,'''');
pl/sql procedure successfully completed.


3、这时候你可以运行应用程序,对于web 应用你就可以打开你认为性能比较差页面。


4、如果你要查看这段时间执行了哪些sql语句,可以执行下面的语句结束跟踪


sql>execute sys.dbms_system.set_ev(49,3406,10046,0,''''); 

pl/sql procedure successfully completed.


5、sql trace 工具会收集这个过程中执行的sql的性能状态数据,记录到一个跟踪文件中.这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,cpu使用时间等。


6、这时候你可以通过下面的语句获得产生的跟踪文件所在的目录

sql> select value from v$parameter where name = ''user_dump_dest'';

value

--------------------------------------------------------------------------------

/opt/oracle/admin/ocn/udump


7、在/opt/oracle/admin/ocn/udump下找到yzoracle_ora_9497.trc。9497是你当前应用的spid。


8、注意yzoracle_ora_9497.trc是不可读的,我们需要执行oracle的tkprof命令,将yzoracle_ora_9497.trc转化为我们可读的文本文件。

tkprof  yzoracle_ora_9497.trc  yzoracle_ora_9497.sql

这样你就可以在yzoracle_ora_9497.sql文件中看到所有的sql语句执行次数,cpu使用时间等数据。


方法二:采用p6spy

    p6spy是一个开源软件,它可以跟踪任何使用jdbc的应用产生的数据库操作。特别适合于监控ejb服务器产生的 sql statements。
    官方网址:http://www.p6spy.com/
    目前p6spy 适用的应用服务器包括jboss, atg, orion, jonas, iplanet, weblogic, websphere, resin and tomcat.

下面我介绍一下p6spy在weblogic上安装的步骤:
(1)http://www.p6spy.com/download.html,下载zip包
(2)解压出p6spy.jar spy.properties两个文件
(3)将p6spy.jar 和spy.properties所在目录放入weblogic的classpath
(4)修改spy.properties

    realdriver= oracle.jdbc.driver.oracledriver  数据库驱动程序的名字

(5)在weblogic控制台,修改jdbc-connection pool的driver class 类名为com.p6spy.engine.spy.p6spydriver
(6)重启weblogic
(7)这样在weblgoic的domain_home目录下的spy.log记录了数据库的访问情况。

方法三:养成良好的编程习惯。在应用的数据访问层dao的程序中,采用log4j打印出数据库操作的日志,这样你就可以在log中看到执行的sql语句了。

比如:

public list getcontactlist(string loginid) throws imcontactdaoexception {
       try {
               conn = getdatasource().getconnection();
               sql = "select a.login_id, a.contact_id,from im_contact a where a.login_id = ?";
               stmt = conn.preparestatement(sql);
               stmt.setstring(1, loginid);
               rs = stmt.executequery();
               log.debug("sql: " + sql);;
                     ......
        } catch (sqlexception se) {
                ....

        } finally {
                ....
        }
}

    如果你采用hibernate实现o/r mapping的话,只需要在hibernate.cfg.xml文件中修改show_sql为true,hibernate就会打印出sql的语句。
<property name="show_sql">true</property>


    很显然,三种方法各有自己的优点和适用场合。

    方法一,适合于oracle数据库,获得的信息丰富,不仅有sql语句,而且包括了各条sql语句执行的情况,非常方便我们调优。

    方法二和方法三都会打印出执行的sql语句,它与数据库平台无关,不过不能得到相关的sql性能数据。对于方法三,如果我们系统不是采用jdbc进行数据库操作的话,比如ejb的entity bean,日志中就不会打印出相应的sql操作。不过ejb的entity bean目前已经被认为是失败之举,你可以在项目的重构中可以把这块重构掉,这个体外话了。

    大家可以根据自己项目的情况,选择合适的方法来跟踪应用产生的sql操作。

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
监控数据库性能的sql
sqlserver端口更改后的数据库连接方式
总结sqlserver中死锁产生的原因及解决办法
sqlserver补丁安装常见问题
sql:使用视图控制用户对数据访问
sql:检查端口号
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(2326)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(7744)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(3274)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号