我有 ResultSet 方法,我将在finally 块中关闭连接:
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();
}
}
但我收到错误:
编辑整个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
我什么地方做得不对?
您正在返回一个ResultSet
供将来使用,但使用后您将关闭连接,因此您无法检索数据,因为资源已经关闭。注意finally
总是被调用,即使你在try
or catch
代码块,参考Java中finally总是执行吗?
详细来说,问题是这样的:
- 打开连接
- 准备一份声明
- 获取结果集
- 返回结果集
- 关闭连接(这可能会关闭关联的资源,即可能会关闭
PreparedStatement
和ResultSet
与当前相关的Connection
)因为,正如之前的链接中所述,finally
块是always至少在 JVM 崩溃或者您使用以下命令手动完成应用程序时执行System.exit
.
- 使用封闭式
ResultSet
。由于上一步,它已关闭。
一个可能的解决方案是你的countdrcountcr
方法和所有其他返回 a 的方法ResultSet
收到Connection
作为参数,因此调用它的方法将处理连接的打开和关闭。另外,请注意,您不应该使用static
如果您在多线程环境中工作,例如处理数据库操作的方法一个网络应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)