我正在处理下面的代码(为了清晰起见编辑),这给了我一些Oracle中打开游标的问题。 基本上我试图从数据库中选择数据,并且返回的每一行都有0或更多行的子数据被选中并附加到记录中。 目前通过在填充主数据集以读取子数据时调用另一个函数来实现此目的。对少量的行数少于1000的情况,它可以正常工作。虽然这是用户可以使用的正常操作范围,但它们可能会请求所有行的数量可能在数千行的10个数量级。在ORA-01000上执行大容量选择结果:最大打开游标超过错误。如果我运行代码并查询v $ open_cursors,则可能会看到光标数计时,直到它结束。Java不释放oracle游标
如果我将调用子函数的行注释掉,它可以正常工作,v $ open_cursors中的光标计数只会上下波动几次。
我注意到,主函数将连接对象传递给子函数,并认为这可能导致结果语句和结果集保持打开状态,而连接仍处于打开状态,即使它们被代码关闭。所以我尝试了更改代码,以便每个函数从池中获取它自己的连接,并在完成时关闭它,但这对游标没有任何影响。
我可以增加游标的数量,但a)只是掩盖了问题,b)我必须坚持到一个愚蠢的高数量,以使其工作,和c)我不想释放有缺陷的代码!
但是我已经用尽了关于如何让代码释放游标的想法。
public ArrayList getCustomerSearchResult(Connection con) throws AnException {
ResultSet rst = null;
PreparedStatement stmt = null;
ArrayList resultList = new ArrayList();
String sql = "---- The search SQL string --- ";
try {
stmt = con.prepareStatement(sql);
rst = stmt.executeQuery();
while(rst.next()) {
DataDTO data = new DataDTO();
data.setSomeData(rst.getString("...."));
// ##### This call is where the problem lies #####
data.setSomeSubDataAsAnArrayList(getSubDataForThisRow(data.getId(), con));
resultList.add(data);
}
} catch(Exception e) {
throw new AnException("Error doing stuff", e);
} finally{
try{
rst.close();
stmt.close();
rst = null;
stmt = null;
}catch(Exception ex){
throw new AnException("Error doing stuff", ex);
}
}
return resultList;
}
public ArrayList getSubDataForThisRow(String Id, Connection con) throws AnException {
ResultSet rst = null;
PreparedStatement stmt = null;
ArrayList resultList = new ArrayList();
String sql = "---- The search SQL string --- ";
try {
stmt = con.prepareStatement(sql);
stmt.setString(1, Id);
rst = stmt.executeQuery();
while(rst.next()) {
SubDataDTO data = new SubDataDTO();
data.setSomeData(rst.getString("...."));
resultList.add(data);
}
} catch(Exception e) {
throw new AnException("Error!", e);
} finally{
try{
rst.close();
stmt.close();
rst = null;
stmt = null;
}catch(Exception ex){
throw new AnException("Error!", ex);
}
}
return resultList;
}
您使用的是哪个版本的数据库?哪些JDBC驱动程序(Oracle的?)以及哪些版本? – APC 2009-09-03 12:50:40
对不起,这里的信息有重大遗漏。 使用ojdbc14.jar的Oracle 10.2.0.1.0。 – javadeveloper 2009-09-04 08:55:35