在JDBC中使用PreparedStatement
时,我应先关闭PreparedStatement
还是先关闭Connection
?我刚刚看到了Connection
首先关闭的代码示例,但在我看来首先关闭PreparedStatement
更合乎逻辑。
是否有标准的,可接受的方式来执行此操作?有关系吗?关闭Connection
是否还会导致PreparedStatement
关闭,因为PreparedStatement
与Connection
对象直接相关?
答案 0 :(得分:40)
声明。我希望你关闭(按顺序)
(并检查沿途的空值!)
即。以反向顺序关闭到开场序列。
如果您使用Spring JdbcTemplate(或类似),那么这将为您照顾。或者,您可以使用Apache Commons DbUtils和DbUtils.close()
或DbUtils.closeQuietly()
。
答案 1 :(得分:7)
应按顺序完成以下程序
ResultSet
PreparedStatement
Connection
。此外,建议关闭finally
中所有与JDBC相关的对象,以保证关闭。
//Do the following when dealing with JDBC. This is how I've implemented my JDBC transactions through DAO....
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = ....
ps = conn.prepareStatement(...);
//Populate PreparedStatement
rs = ps.executeQuery();
} catch (/*All relevant exceptions such as SQLException*/Exception e) {
logger.error("Damn, stupid exception: " , e);
} finally {
if (rs != null) {
try {
rs.close();
rs = null;
} catch (SQLException e) {
logger.error(e.getMessage(), e.fillInStackTrace());
}
}
if (ps != null) {
try {
ps.close();
ps = null;
} catch (SQLException e) {
logger.error(e.getMessage(), e.fillInStackTrace());
}
}
try {
if (conn!= null && !conn.isClosed()){
if (!conn.getAutoCommit()) {
conn.commit();
conn.setAutoCommit(true);
}
conn.close();
conn= null;
}
} catch (SQLException sqle) {
logger.error(sqle.getMessage(), sqle.fillInStackTrace());
}
}
您可以看到我已检查我的对象是否为空并且是否为连接,如果连接未自动更新,请检查首先。许多人未能检查它并意识到事务尚未提交给DB。