一、问题描述
下面的代码使用了try-with-resource语法,会自动关闭Connection
和Statement
,是否还需要关闭ResultSet
?
Statement
关闭后ResultSet
会被回收么?
二、JDBC规范
JDBC规范4.3中有对Statement关闭后是否需要关闭ResultSet进行说明。
应用调用了 statement.close
表明其已经完成了 statement
的使用。所有的 statment
对象都将在创建他们的 connection
被关闭时 一起被关闭。但在 statements
对象已经处理完成后尽快关闭对程序来说是一个好的实现。这能够使得statment
立刻释放占用的资源。
关闭一个statement对象
同时也会使得该对象创建的所有resultSet对象
被关闭。resultSet所持有的资源不会立刻被释放,直到GC执行, 因此当resultSet对象
不再被需要时明确地关闭是一个很好的做法。
一旦statement对象
被关闭,调用了该对象本身isColsed
和colse
方法的自身任何方法都将抛出SQLException
异常。
以上有关 关闭statement对象
的内容也同样适用于PreparedStatement
和CallableStatement
。
Tips:关闭连接时最好按照resultSet先关,statement接着,connection最后的顺序。