当前位置: 首页 > 知识库问答 >
问题:

Jdbc连接关闭和preparedstatement关闭

寇照
2023-03-14

嗨,我只知道这是一个古老的问题,但今天只是好奇。正如我们所知connection.close也会关闭preared语句(如果我错了请纠正我)。但是如果我关闭连接然后关闭preared语句会怎样

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

我会得到一个空指针异常吗?

有人说这取决于jvm的速度。有时,ps.close()会在conn.close完成其工作之前运行并首先关闭,因此您不会得到null指针。

为了测试它,我修改了代码

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

但是我没有得到零点。

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

谢谢大家。

共有2个答案

齐坚成
2023-03-14

按照语句界面的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.** 

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

皇甫树
2023-03-14

语句的JavaDoc。close()状态:

对已经关闭的对象调用方法没有效果。

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

 类似资料:
  • 我有一个verticle,它使用来自事件总线的消息并对其进行处理。我有一个问题,JDBC连接应该在什么时候关闭。有两种方法 > 消息处理完毕后关闭连接。但这将是非常昂贵的,因为我将打开/关闭连接每次。 相信verticle停止/取消部署时vertx会关闭连接(实际上永远不会),并且只要连接打开,就不会有任何内存泄漏。我将在start()方法中打开连接,这样每当有消息时它就可用。 另一方面,如果我有

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 我编写了以下代码来连接到Oracle数据库。这用于REST API。我正在连接的数据库的IDLE_TIME参数设置为30分钟(这不能更改)。如果数据库连接空闲超过30分钟,则会抛出以下错误:“java.sql.SQLRecoverableException: ClosedConnection”。抛出此错误后,API将停止工作。我如何解决这个问题?

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

  • 我最近转到了一个项目,在这个项目中我遇到了很多这种性质的代码--(这是使用jdbc postgres驱动程序) 显然,这段代码已经在生产中运行了一段时间,没有引起问题。 为了进一步澄清,如果我的理解是正确的(即,statement和resultset必须在连接关闭之前而不是之后关闭),我需要在catch和finally之间重复一些代码。修订后的代码如下所示。这可以简化吗? 只是为了透视,这段代码是