Java 我应该先关闭哪一个,准备好的报表还是连接?
在JDBC中使用Java 我应该先关闭哪一个,准备好的报表还是连接?,java,jdbc,connection,prepared-statement,Java,Jdbc,Connection,Prepared Statement,在JDBC中使用PreparedStatement时,我应该先关闭PreparedStatement还是先关闭连接?我刚刚看到一个代码示例,其中首先关闭了连接,但在我看来,首先关闭PreparedStatement更符合逻辑 有没有一个标准的,公认的方法来做到这一点?这有关系吗?关闭连接是否也会导致PreparedStatement关闭,因为PreparedStatement与连接对象直接相关?语句。我希望你(按顺序)关门 结果集 声明 连接 (并检查沿途是否存在空值!) i、 e.按与打开顺序
PreparedStatement
时,我应该先关闭PreparedStatement
还是先关闭连接
?我刚刚看到一个代码示例,其中首先关闭了连接
,但在我看来,首先关闭PreparedStatement
更符合逻辑
有没有一个标准的,公认的方法来做到这一点?这有关系吗?关闭
连接
是否也会导致PreparedStatement
关闭,因为PreparedStatement
与连接
对象直接相关?语句。我希望你(按顺序)关门
如果您使用Spring(或类似产品),那么它将为您解决此问题。或者,您可以使用and
DbUtils.close()
或。应按顺序执行以下步骤
ResultSet
PreparedStatement
连接
finally
close中关闭所有与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。的确如此。某些JDBC驱动程序在连接关闭后关闭结果集或语句时会抛出异常。这是正确的。切中要害:在获取资源时按相反的顺序关闭它们。所有最终的样板文件都应该压缩成一个实用方法(例如
DBUtils.close(rs,ps,conn);
)。关于自动提交的建议也取决于具体情况。有时,当出现异常时,您根本不想提交。另外,显式地将引用设置为null几乎总是不需要的,因为当方法退出时,它将被取消引用,希望在这之后很快,否则该方法可能太长。@Yishai,是的,我忘了提到如果有异常并且自动提交关闭,您可以执行回滚…感谢您展示了这一点。尽管根据规范,在连接关闭时语句应该关闭,但JDBC驱动程序已被发现存在这方面的问题,因此显式关闭语句(和结果集)被认为是一种良好的做法。请按打开它们的相反顺序关闭。一切。