我应该手动关闭从DataSource获取的连接吗?

15

当我从DataSource获取一个Connection时,我是否应该手动关闭它?我的意思是,如果我必须关闭它,在未来的请求中它又会如何使用?

3个回答

20
从连接池中获取的连接应该与普通连接完全相同。JDBC 4.2规范(第11.1节)关于池化的说明如下:
引用: “当应用程序使用完连接后,应该使用Connection.close方法关闭逻辑连接。这会关闭逻辑连接但不会关闭物理连接。相反,物理连接将返回到池中以便重复使用。”
连接池对客户端来说是完全透明的:客户端获取一个池化连接,并且“使用它的方式与获取和使用非池化连接的方式完全相同”。
这意味着当你完成一个连接时,总是要调用Connection.close()!无论它是物理连接还是从池中获取的逻辑连接。
原因在于,连接是直接连接还是来自池中的逻辑连接,纯粹是配置问题,而不是仅仅使用连接的应用程序代码的问题。
如果是连接池情况下,close()操作可能因实现的细节而异,并且某些实现在这方面上是有缺陷的 - 将失效逻辑连接并向连接池发出底层物理连接可供重用的信号。连接池可以进行一些有效性检查,然后将(物理)连接返回到池中或关闭它(例如,如果池中有太多空闲连接,或者连接过期等)。
调用close()不仅是允许的,而且对于连接池的正常工作非常重要。如果不调用close(),通常需要一些辅助线程来关闭(回收)长时间使用的逻辑连接。由于这个超时通常比正常应用程序需求更长,它可能导致池的耗尽,或者配置需要比实际必要的更高的最大连接数的情况。

4

为了将连接返回到池中,您应该关闭 Connection。下次您请求来自池的 Datasource.getConnection() 连接时,将获取该连接。这里没有问题。 有时您不想在每个操作之后关闭连接,而是要对多个操作使用同一个连接。在这种情况下,直到最后一个操作完成之前,您不应该关闭它。


2
此外,JDBC规范明确指出:“连接池对客户端完全透明:客户端获取一个池化连接并像获取和使用非池化连接一样使用它。”(JDBC 4.2规范,第11.1节) - Mark Rotteveel

0
使用try-with-resources来避免连接问题。
try (Connection con = ds.getConnection();
    Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(...)) {...}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接