追蹤應用程式所執行的sql語句

zhaoqing0803發表於2011-07-05
我們在確定應用程式效能的時候,更多地會關注其中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的語句。
  true
  
  很顯然,三種方法各有自己的優點和適用場合。
  
  方法一,適合於oracle資料庫,獲得的資訊豐富,不僅有sql語句,而且包括了各條sql語句執行的情況,非常方便我們調優。
  
  方法二和方法三都會列印出執行的sql語句,它與資料庫平臺無關,不過不能得到相關的sql效能資料。對於方法三,如果我們系統不是採用jdbc進行資料庫操作的話,比如EJB的Entity Bean,日誌中就不會列印出相應的sql操作。不過EJB的Entity Bean目前已經被認為是失敗之舉,你可以在專案的重構中可以把這塊重構掉,這個體外話了。
  
  大家可以根據自己專案的情況,選擇合適的方法來跟蹤應用產生的SQL操作。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23205405/viewspace-701457/,如需轉載,請註明出處,否則將追究法律責任。

相關文章