Jdbc 如何正确关闭连接?
这个问题已经被问了很多次了,关于这个问题有很多资源在讨论。但这仍然让我担心,因为我认为close()不能正常工作Jdbc 如何正确关闭连接?,jdbc,connection,Jdbc,Connection,这个问题已经被问了很多次了,关于这个问题有很多资源在讨论。但这仍然让我担心,因为我认为close()不能正常工作 PreparedStatemet pstmt = null; try { pstmt = conn.prepareStatement(query); ... pstmt.close(); conn.close(); } catch(...) { ... } finally { if(pstmt != null) { try { p
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);
}
所以我希望它打印出空值;但它会不断打印出查询字符串和到数据库的连接路径 您的代码在这里
try {
PreparedStatemet pstmt = null;
创建在finally块中不应可见的pstmt,因为它是另一个作用域中的局部变量
您可能在try-catch区块之外的某个地方有另一个pstmt。这就把你的支票弄乱了
尝试注释掉PreparedStatemet pstmt=null代码>在您的try块中查看您的代码是否仍然生成,这将帮助您确定pstmt的覆盖声明的确切位置
编辑:
关闭准备好的语句/连接并不意味着这些值将被重置。您的connection&prepared语句现在确实已关闭,因为您没有将它们设置为null,所以存储在其中的数据值仍在打印中。这应该不是问题
虽然不是什么大问题,但在关闭conn和pstmt时,也可以将它们设置为null,这样也可以清除这些变量使用的本地内存。但是请记住,当您执行关闭呼叫时,连接仍然处于关闭状态。我的错误输入,我的PreparedStatement在try-catch块之外。我现在编辑代码为什么?它可以打印出它喜欢的任何东西。你的期望显然是错的。对不起,我不明白你的意思。我认为当我们关闭ptsmt和conn时;它们都应该变为null,不是吗?不。(a)当您将它们设置为null时,引用将变为null。不是这样。(b) 您看到的是对非null引用调用toString()的结果,该引用可以是相关类喜欢的任何引用。哦,我明白了。谢谢你的澄清。