我有ResultSet方法,我在一个finallly块中关闭Connection:
public static ResultSet countdrcountcr(String vforacid) throws SQLException {
ResultSet rs = null;
Connection conn = null;
try {
conn = db.getDbConnection();
String sql = "SELECT NVL (SUM (DECODE (part_tran_type, 'D', 1, 0)), 0), "
+ " NVL (SUM (DECODE (part_tran_type, 'C', 1, 0)), 0) "
+ " FROM tbaadm.htd WHERE acid IN (SELECT acid "
+ " FROM tbaadm.gam WHERE foracid = '" + vforacid + "') "
+ " AND tran_date >= '22-NOV-2013' AND tran_date <= '30-NOV-2013' "
+ " AND pstd_flg = 'Y' AND del_flg != 'Y'";
PreparedStatement ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
return rs;
} finally {
conn.close();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误:
编辑整个ErrorTrace
Exception in thread "main" java.sql.SQLException: Closed Connection: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:181)
at statement.Statement.main(Statement.java:34)
Java Result: 1
Run Code Online (Sandbox Code Playgroud)
我做得不对劲?
您将返回以ResultSet供将来使用,但在使用它之后您将关闭连接,因此您无法检索数据,因为资源已关闭.请注意finally,即使您在try或catch代码块中返回某些内容,也始终会调用它,请参阅最终是否始终在Java中执行?
详细而言,这就是问题所在:
PreparedStatement并ResultSet与当前关联Connection),因为如前面的链接所示,finally阻止始终至少执行JVM崩溃或您手动完成应用程序System.exit.ResultSet.它由于上一步而关闭.一种可能的解决方案是您的countdrcountcr方法和返回的所有其他方法都ResultSet接收Connectionas参数,因此调用它的方法将处理连接打开和关闭.另外,请注意,static如果您在多线程环境(例如Web应用程序)中工作,则不应使用方法来处理数据库操作.