2011-12-22 257 views
2

我們有一個Java類,它循環遍歷包含Store信息的結果集,然後開始爲每個相應的存儲處理ascii文件。對於每個商店處理ascii文件需要大約5分鐘。我們遇到的問題是,在處理第一個商店的ascii文件並獲取下一個結果集後,我們得到一個SQLException,表示「DSRA9110E:ResultSet已關閉」。DSRA9110E:ResultSet已關閉

我們的代碼基本上是這樣的。

private void startProcess() throws Exception { 
    PreparedStatement pstmt = null; 
    ResultSet rs = null; 

    try { 
     pstmt = conn.prepareStatement("SELECT STORE_CODE FROM STORE"); 
     rs = pstmt.executeQuery(); 

     while (rs != null && rs.next()) { 
      System.out.println("Processing store " + rs.getString("STORE_CODE")); 

      try { 
       processStoreSalesFile(); 
      } catch (Exception e) { 
       conn.rollBack(); 
       e.printStackTrace(); 
      } 

      if (rs != null) { 
       System.out.println("ResultSet is not null"); 
      } 
     } 
    } finally { 
     if (rs != null) { 
      rs.close(); 
      rs = null; 
     } 

     if (pstmt != null) { 
      pstmt.close(); 
      pstmt = null; 
     } 
    } 
} 

當發生錯誤時,我確實看到系統打印行「ResultSet is not null」。但是當它得到下一個ResultSet時,它說ResultSet被關閉。

我試圖註釋掉調用processStoreSalesFile()的代碼,我們沒有得到這個錯誤,並且它能夠在不拋出任何異常的情況下獲取下一個ResultSet。

我嘗試的下一個嘗試是取消註釋對方法processStoreSalesFile()的調用,然後從文件系統中刪除任何ascii文件,以便程序沒有任何可處理的內容。也沒有例外拋出。

我們的設置是WebSphere-Informix。我們有另一個設置WebSphere-Oracle,並沒有任何問題。

我懷疑的是ResultSet有超時或者它只是不想等待進程完成並自行關閉。

更新1: 在processStoreSalesFile()方法內部,有一個conn.commit()調用來提交記錄。是否當一個提交被調用時,ResultSet將被關閉?在WAS管理控制檯中,我已經將數據源屬性resultSetHoldability添加爲值'1'。但是ResultSet仍然關閉。

我希望有人能幫助我在這裏:(

感謝。

回答

2

這裏是我們所做的工作,最初,Websphere被配置爲使用Informix JDBC驅動程序作爲其數據源,因爲我們正在連接到一個Informix數據庫,我們將其更改爲使用DB2 JCC Driver(由IBM Informix技術支持部門提出) ),然後在數據源自定義屬性中,我們設置'res ultHoldability'值設置爲'1'(HOLD_CURSORS_OVER_COMMIT)。重新運行該程序,並設法遍歷結果集中的所有結果。

1

你可以使用pstmt.setQueryTimeout(秒)。確保Oracle驅動程序支持這一點。對於更詳細 here

+0

我剛試過。我做了pstmt.setQueryTimeout(0)和pstmt.setQueryTimeout(1000)。我仍然收到錯誤:「[12/23/11 4:04:16:915 MYT] 00000017 SystemOut O com.ibm.websphere.ce.cm.ObjectClosedException:DSRA9110E:ResultSet已關閉。」 –

+0

連接可能關閉。可以本地化連接對象並重試。 – nayakam