我最近将Oracle JDBC驱动程序版本从11.2.0.1升级到12.1.0.1。然而,我注意到一件非常奇怪的事情。在我的一个测试中,我使用Java中的以下代码关闭ResultSet对象两次:
if (resSet != null) {
try {
resSet.getStatement().close();
} catch (NullPointerException ne) {
// nothing to do!
// NullPointerException seen at Oracle and Sybase!
}
}
当我使用旧的JDBC驱动程序11.2.0.1时,这没有任何异常。但是当我切换到新的JDBC驱动程序12.1.0.1时,它会引发异常:
java.sql.SQLException: Closed Resultset: getStatement
at oracle.jdbc.driver.InsensitiveScrollableResultSet.getStatement(InsensitiveScrollableResultSet.java:272)
为什么会这样?当我检查ResultSet的JavaDoc时,它说:在已经关闭的ResultSet对象上调用close方法是无操作。
所以现在我很困惑,两次关闭是非操作意味着它不应该抛出任何异常,对吗?
我正在使用JDK7u45和java.sql.ResultSet。
答案 0 :(得分:3)
正如评论中已经指出的那样,您不是在调用ResultSet.close()
,而是调用ResultSet.getStatement()
,然后调用Statement.close()
。
对resSet.getStatement()
的调用是引发异常的原因,正如JDBC spec/api doc所要求的那样:
<强>抛出:强>
SQLException
- 如果发生数据库访问错误或在关闭的结果集上调用此方法
(强调我的)
答案 1 :(得分:1)
这是符合ResultSet.getStatement API的正确行为
*Throws:
SQLException - if a database access error occurs or this method is called on a closed result set*