繁体   English   中英

JDBC连接关闭和PreparedStatement关闭

[英]Jdbc connection close and preparedstatement close

大家好,我知道这是一个老问题,但今天只是好奇。 我们知道connection.close也会关闭prepareStatement(如果我错了,请纠正我)。 但是如果我关闭连接然后关闭prepareStatement,该怎么办

conn.close();
ps.close();

我会得到一个nullpointer异常吗?

有人说这取决于您的jvm速度。有时ps.close()会先运行并先关闭,然后conn.close完成工作,这样您就不会得到nullpointer。

为了测试,我修改了代码

conn.close();
Thread.sleep(5000);//I give 5s to conn.close to finish his work. should be enough
ps.close();

但是我没有得到空指针。

所以我的问题是,如果我先关闭conn然后再关闭ps,这里会发生什么。

谢谢大家

用于Statement.close()的JavaDoc指出:

在已关闭的Statement对象上调用close方法无效。

我建议这意味着,如果您的语句已经被Connection.close()调用关闭,则实现不应抛出异常。

根据语句接口的javadoc

close
void close()
           throws SQLExceptionReleases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources. 
**Calling the method close on a Statement object that is already closed has no effect.** 

因此,如果您关闭一个已经关闭的Statement不会有任何问题。

该行为特定于驱动程序实现或连接池实现。 它们基本上装饰了基础的连接/声明/结果集并跟踪其状态。 因此,实现可以选择在关闭主要对象之前先关闭依赖对象。 Primrose连接池用于在Connection上调用close()方法时打印有关未结束语句或结果的警告(该方法被重写以将连接返回到池)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM