2012-06-12 61 views
5

當我的結果集數據量較大,我得到 com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][4.9.78] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null例外,但是當我儘量不與結果集無效操作:結果集關閉

下面的數據量較少是我的代碼片段

ResultSet rs=null; 
String sql_query="select * from exception_main;select * from m_roles" 
String query1=sql_query.toUpperCase(); 
String[] results=query1.split(";");   
CSVWriter writer = new CSVWriter(new FileWriter(csv_file_path + csv_file_name), ',',CSVWriter.NO_QUOTE_CHARACTER);      
for(int i=0;i<results.length;i++)       
{        
    if(results[i].startsWith("SELECT"))        
    {         
    System.out.println("Inside select"+ results[i]);        

    ps = conn1.prepareStatement(results[i].toString());        
    rs = ps.executeQuery();    

    ...       

    //writing to csv file       
    System.out.println("Count..." + rs.getRow());       
    writer.writeAll(rs, true);       

    while(rs.next()){         
     rs.deleteRow();         
    }       
    System.out.println("Count...3:::::::" + rs1.getRow());  
    }  
} 
writer.close(); 
rs.close(); 

回答

10

保持

stmt = conn1.createStatement(); 

前的for循環。

7

Java docs

Result對象由Statement對象自動關閉,該對象在Statement對象關閉,重新執行或用於檢索n時生成它ext由多個結果序列產生。

因此你的錯誤。

您的stmt您的for循環中每次都會重新執行語句對象。

此外,from here

對於非持有遊標,在驅動程序完成通過第一ResultSet中步進,司機會犯下流如果autoCommit爲上,並且將關閉一切。如果您希望其他ResultSet保持打開狀態,您可能需要使用with hold光標。


編輯:

(到OP - 慈祥發佈一個片斷不要不斷改變片段的所有時間。) 答案還是一樣:您正在使用兩個查詢同樣ResultSet,在你for循環。這是行不通的。如果你重新執行不同的查詢相同Statement對象的ResultSet將被關閉。無論是使用不同的Statement對象,或者使用不同的方法,並放棄這一for循環理念。

相關問題