我应该手动关闭从数据源获取的连接吗?

问题描述 投票:0回答:3

当我从

Connection
得到
DataSource
时,我应该手动关闭它吗?我的意思是,如果我必须关闭它,它将如何在将来的请求中使用?

java jdbc datasource
3个回答
21
投票

从连接池获取的连接应该和普通连接一样使用。 JDBC 4.2 规范(第 11.1 节)谈到了池化:

当应用程序使用完连接后,它会关闭逻辑连接 使用方法

Connection.close
。这会关闭逻辑连接,但不会 不关闭物理连接。相反,物理连接将返回到 池,以便可以重复使用。

连接池对客户端完全透明:客户端获取连接池 连接并 使用它 获取并 使用非池化连接 连接

(强调我的)

这意味着当您完成连接后,您总是会拨打

Connection.close()
!无论是物理连接还是来自池的逻辑连接都没关系。

原因是连接是物理(直接)连接还是逻辑连接应该纯粹是配置问题,而不是仅仅使用该连接的应用程序代码的问题。

在连接池的情况下,

close()
- 细节可能会有所不同,并且某些实现在这方面存在错误 - 使逻辑连接无效并向连接池发出信号,表明底层物理连接可供重用。连接池可能会进行一些有效性检查,然后将(物理)连接返回到池中或将其关闭(例如,如果池中有太多空闲连接,或者连接太旧等)。

调用

close()
不仅是允许的,而且对于连接池的正确工作甚至是至关重要的。不调用
close()
通常需要一些辅助线程来关闭(回收)已使用太长时间的逻辑连接。由于此超时通常比正常应用程序需要的时间长,因此可能会导致池耗尽,或者导致池需要的最大连接数高于实际需要的配置。


4
投票

您应该关闭

Connection
以便将其返回到池中,下次您将请求从池中获得
Datasource.getConnection()
连接。这里没有问题。 有时您不想在每次操作后关闭连接并为多个操作使用相同的连接。在这种情况下,您不应该在最后一个操作完成之前关闭它。


0
投票

对资源使用 try 以避免连接问题

try (Connection con = ds.getConnection();
    Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(...)) {...}
© www.soinside.com 2019 - 2024. All rights reserved.