java 和 oracle 中的最大打开游标数超出异常
maximum open cursors exceeded exception in java and oracle
我的代码有问题:
错误:ORA-01000:超出最大打开游标。此代码从多个线程调用。
问:Oracle 游标是否不同于 JDBC 游标(结果集)?
public static void viewTable(Connection con, String TBName)
throws SQLException {
Statement stmt = null;
String query = "select *from " + TBName;
try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String studentName = rs.getString("STD_NAME");
System.out.println(studentName + "\t");
}
} catch (SQLException e ) {
e.printStackTrace();
} finally {
if (stmt != null) { stmt.close(); }
}
}
您应该始终关闭结果集和语句。正如您所说,您的代码被许多线程访问,因此很多结果集将打开并且永远不会
已关闭。
将 ResultSet 变量从 try catch 块中取出,并在语句关闭旁边的 finally 中将其关闭。
使用try-with-resources确保语句和结果集都关闭。
String query = "select STD_NAME from " + TBName;
try (Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) {
String studentName = rs.getString("STD_NAME");
System.out.println(studentName + "\t");
}
} // Closes rs and stmt even with exceptions.
我的代码有问题: 错误:ORA-01000:超出最大打开游标。此代码从多个线程调用。 问:Oracle 游标是否不同于 JDBC 游标(结果集)?
public static void viewTable(Connection con, String TBName)
throws SQLException {
Statement stmt = null;
String query = "select *from " + TBName;
try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String studentName = rs.getString("STD_NAME");
System.out.println(studentName + "\t");
}
} catch (SQLException e ) {
e.printStackTrace();
} finally {
if (stmt != null) { stmt.close(); }
}
}
您应该始终关闭结果集和语句。正如您所说,您的代码被许多线程访问,因此很多结果集将打开并且永远不会 已关闭。
将 ResultSet 变量从 try catch 块中取出,并在语句关闭旁边的 finally 中将其关闭。
使用try-with-resources确保语句和结果集都关闭。
String query = "select STD_NAME from " + TBName;
try (Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) {
String studentName = rs.getString("STD_NAME");
System.out.println(studentName + "\t");
}
} // Closes rs and stmt even with exceptions.