当我的结果集数据很大时,我得到了
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();
答案 0 :(得分:10)
保持
stmt = conn1.createStatement();
在for循环之前。
答案 1 :(得分:7)
来自Java docs:
当Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,Statement对象会自动关闭它生成它的Statement对象。 < / p>
因此你的错误。
每次stmt
循环中都会重新执行for
Statement对象。
另外,from here:
对于非持有游标,当驱动程序完成单步执行第一个ResultSet时,如果启用了autoCommit,驱动程序将流出提交,这将关闭其他所有游标。如果您希望其他ResultSet保持打开状态,您可能需要使用with hold cursor。
修改强>
(对OP - 请发布一个片段。不要一直更改片段)
答案仍然是相同的:您在ResultSet
循环中的同一for
上使用了两个查询。那不行。如果您使用不同的查询重新执行相同的ResultSet
对象,则Statement
将被关闭。使用不同的Statement
对象,或使用不同的方法并删除此for
循环的想法。