转至繁体中文版     | 网站首页 | 文章中心 | 下载中心 | 图片中心 | 笑话频道 | 教程频道 | 会员中心 | 雁过留声 | 
最新公告:     "MinTao学以致用网"欢迎您的光临,你的支持便是我们的动力,欢迎广大网友和各界人士亲临指导,你们的一个小小的建议便是我们发展的开路石!  [MinTao  2007年9月5日]        
您现在的位置: MinTao学以致用网 >> 文章中心 >> 电子课堂 >> 数据库 >> Sql Server >> 文章正文
专题栏目
更多内容
最新推荐 更多内容
相关文章
SQL语言快速入门之一
SQL语言快速入门之二
SQL语言快速入门之三(一
SQL7.0储存过程调试
通过HTTP访问SQL Server
SQL Server的存储过程调
SQL Server安全性简介
定制PB与SQL Anywhere的
全面接触SQL语法
SQL 语法参考手册
更多内容
如何获得应用程序所执行的SQL语句         
如何获得应用程序所执行的SQL语句
作者:yzhz 文章来源:不详 点击数: 更新时间:2007-11-14 12:57:14

版权声明:如有转载请求,请注明出处:http://blog.csdn.net/yzhz

        我们在确定应用程序性能的时候,更多地会关注其中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操作。

 

 

文章录入:mintao    责任编辑:mintao 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007 MinTao学以致用网(www.mintao.net) Inc All Rights Reserved.
    QQ:543098146有事请Q我! QQ:261561092有事请Q我 QQ:179647303有事请Q我 MSN:min906@126.com
    站长:MinTao 信息产业部ICP备案号:鄂ICP备07500065号

    学以致用是我们学习者的至高境界和不懈追求,[MinTao学以致用网]与大家共同学习,共同进步……
    信息产业部备案
    *鄂ICP备07500065号