据说在使用完JDBC资源后关闭所有资源是一个好习惯。但是如果我有下面的代码,是否有必要关闭Resultset和Statement?
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = // Retrieve connection
stmt = conn.prepareStatement(// Some SQL);
rs = stmt.executeQuery();
} catch(Exception e) {
// Error Handling
} finally {
try { if (rs != null) rs.close(); } catch (Exception e) {};
try { if (stmt != null) stmt.close(); } catch (Exception e) {};
try { if (conn != null) conn.close(); } catch (Exception e) {};
}
问题是关闭连接是否有效,或者是否会留下一些可用的资源。
来自javadocs:
当一个Statement对象被关闭时,它的
当前ResultSet对象,如果有
存在,也是封闭的。
然而,当你关闭底层连接时,javadocs并不清楚Statement和ResultSet是否关闭。它们简单地声明关闭一个连接:
释放这个Connection对象的
数据库和JDBC资源
立即而不是等待
它们将被自动释放。
在我看来,当你用完ResultSets, Statements和Connections时,总是显式地关闭它们,因为close的实现在不同的数据库驱动程序中是不同的。
通过在Apache的DBUtils中使用closequiet等方法,可以节省大量的模板代码。
来自javadocs:
当一个Statement对象被关闭时,它的
当前ResultSet对象,如果有
存在,也是封闭的。
然而,当你关闭底层连接时,javadocs并不清楚Statement和ResultSet是否关闭。它们简单地声明关闭一个连接:
释放这个Connection对象的
数据库和JDBC资源
立即而不是等待
它们将被自动释放。
在我看来,当你用完ResultSets, Statements和Connections时,总是显式地关闭它们,因为close的实现在不同的数据库驱动程序中是不同的。
通过在Apache的DBUtils中使用closequiet等方法,可以节省大量的模板代码。