Jdbc连接关闭和preparedstatement关闭

时间:2012-09-04 07:09:19

标签: java jdbc database-connection prepared-statement

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

该怎么办?
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();

但我没有得到nullpointer。

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

谢谢大家。

3 个答案:

答案 0 :(得分:4)

Statement.close()的JavaDoc声明:

  

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

我建议,如果您的声明已被Connection.close()调用关闭,则表示实施应该不会例外。

答案 1 :(得分:1)

根据Statement Interface的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,则不会有任何问题。

答案 2 :(得分:0)

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