我有一个jdbc postgresql
应用程序,我编写了“标准”连接管理器。对于每个成功的事务,我关闭语句对象和连接对象。
如果SQLException
或ClassNotFoundException
中的一个出现,语句和连接对象会发生什么?在catch块中我应该关闭这两个对象吗?类似的东西:
Connection conn = null;
PreparedStatement pstm = null;
try {
conn = ConnectionManager.getConnection();
pstm = conn.CreateStatement(statement);
//set statement
}catch (SqlException ex) {
if(conn != null) {
pstm.close();
conn.close();
}
throw new MyException("error");
}catch (ClassNotFoundException ex) {
if(conn != null) {
pstm.close();
conn.close();
}
throw new MyException("error");
}
}
答案 0 :(得分:4)
在catch块中我应该关闭这两个对象吗?
否即可。切勿关闭挡块中的任何物体。要关闭任何资源,请使用finally{}
阻止。
答案 1 :(得分:2)
您可以将您的连接和语句关闭语句放在finally块中,以确保无论是否存在异常都将其关闭。当try块退出时,最终总是很有用。你可以尝试这样的事情:
Connection conn = null;
PreparedStatement pstm = null;
try {
conn = ConnectionManager.getConnection();
pstm = conn.CreateStatement(statement);
//set statement
}catch (SqlException ex) {
throw new MyException("error");
}catch (ClassNotFoundException ex) {
throw new MyException("error");
}finally {
if(conn != null) {
try {
pstm.close();
conn.close();
} catch (SQLException e) {
// throw or log the exception;
}
}
}
}
答案 2 :(得分:2)
在您的代码资源中,尝试在多个位置关闭资源,导致代码重复。
所以你应该使用finally
块来关闭像bellow这样的资源:
finally {
if (pstm != null) {
try {
pstm.close();
} catch (SQLException e) { /* ignored */}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
}
因为无论发生什么事情,都会在返回方法调用之前执行finally
块。