这个问题已被多次询问,并且有很多资源都在讨论这个问题。但它仍然让我担心,因为我认为close()不能正常工作。
PreparedStatemet pstmt = null;
try {
pstmt = conn.prepareStatement(query);
...
pstmt.close();
conn.close();
} catch(...) {
...
} finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
pstmt = null;
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
conn = null;
}
}
System.out.println("PreparedStatement: " + pstmt);
System.out.println("Connection: " + conn);
}
所以我预计会打印出null;但它会打印出查询字符串和数据库的连接路径。
答案 0 :(得分:0)
您的代码
try {
PreparedStatemet pstmt = null;
创建一个在finally块中不可见的pstmt,因为它是另一个范围内的局部变量。
你可能在try catch块之外的某个地方有另一个pstmt。这是在finally块中弄乱你的支票。
尝试在try块中注释掉PreparedStatemet pstmt = null;
以查看代码是否仍然构建,这将有助于您确定pstmt的覆盖声明到底在哪里。
修改强> 关闭准备好的语句/连接并不意味着将重置值。你的联系和准备好的语句现在确实已关闭,因为您没有将它们设置为null,所以内部存储的数据值仍在打印中。这应该不是问题。
虽然不是一个大问题,但是当你关闭它们时,你也可以将conn和pstmt设置为null,以清除这些变量所使用的本地内存。但请记住,当您进行近距离通话时,连接仍然已关闭。