2012-07-18 113 views
0

hiii, 我在我的web應用程序的java類中調用了一個存儲過程,有一些報告花費了很多時間來渲染jsp/HTML,我也用存儲過程查詢它只需要2秒鐘就可以在oracle瀏覽器中執行。我檢查了我的SP調用代碼,發現我的結果集獲取時間非常少,但是當試圖用While(rst.next)迭代結果集時,它幾乎需要3分鐘才能在while循環中打印SOP,我疑問必須有問題與ret.next(), 我的代碼如下,jdbc resultset性能下降

Connection connection = null; 
CallableStatement stmt = null; 
ResultSet rst   = null ; 


connection = DBConnector.getConnection(); 

stmt = connection.prepareCall("{call MIS_GSGR_ASON.MIS_DIVNETSALE_ASON(?,?,?,?,?,?,?,?,?)}"); 


      stmt.setString(1,START_DT);     
      stmt.setString(2,END_DT);     
      stmt.setString(3,DIVISION);    
      stmt.setString(4,LOC_ID); 
      stmt.setInt(5,USER_GRP); 
      stmt.setInt(6,FIELD_ID); 
      stmt.setInt(7,Integer.parseInt(PERIOD_ID)); 
      stmt.setString(8,zone); 
      stmt.registerOutParameter(9+INC,OracleTypes.CURSOR); 
      stmt.execute(); 
      rst = (ResultSet) stmt.getObject(9+INC); 

      System.out.println("Got resultset . . . ."); 

      data = new ArrayList<MainActionAll>(); 


      while(rst.next()){ 
      System.out.println("In loop");} 

任何幫助將高度appriciated,請 感謝幫助我,AMOL

+1

我不知道你通常在你的結果集迭代中做什麼,但在緊密的循環中打印到控制檯的簡單行爲本身*非常昂貴 – 2012-07-18 10:15:00

+0

即時只是試圖打印我插入的SOP在while循環中,在獲得結果集後,我不能打印該語句,但它花費太多時間才能在控制檯上打印 – Amol 2012-07-18 11:11:15

+0

您可以使用輸出到控制檯的代碼將您的代碼註釋掉嗎? – Olaf 2012-07-18 13:00:08

回答

0

也許您運行查詢通過慢速網絡,如果有很多行返回它的作品非常慢?

添加一些時間檢查和而不是打印到控制檯簡單地計算記錄:

... 
... 
... 
stmt.registerOutParameter(9+INC,OracleTypes.CURSOR); 
long t0, t1, t2, t3, t4, t5; 
t0 = System.currentTimeMillis(); 
stmt.execute(); 
t1 = System.currentTimeMillis(); 
rst = (ResultSet) stmt.getObject(9+INC); 
t2 = System.currentTimeMillis(); 
System.out.println("Got resultset . . . ."); 
data = new ArrayList<MainActionAll>(); 
t3 = System.currentTimeMillis(); 
t4 = t3; 
t5 = t3; 

int rec_cnt = 0; 
if (rst.next()) 
    { 
    ++rec_cnt; 
    t4 = System.currentTimeMillis(); 
    while (rst.next()) 
     ++rec_cnt; 
    t5 = System.currentTimeMillis(); 
    } 
System.out.println("execute: " + (t1 - t0)); 
System.out.println("stmt.getObject: " + (t2 - t1)); 
System.out.println("Array: " + (t3 - t2)); 
System.out.println("1st next: " + (t4 - t3)); 
System.out.println("loop: " + (t5 - t4)); 
System.out.println("rec cnt: " + (rec_cnt)); 

嘗試執行它靠近數據庫服務器可以減少網絡傳輸(本地主機首選)。用這些時間編輯你的問題。