【发布时间】:2014-05-30 14:48:15
【问题描述】:
当我从DataSource 获得Connection 时,我应该手动关闭它吗?我的意思是如果我必须关闭它,它将如何在未来的请求中使用?
【问题讨论】:
标签: java jdbc datasource
当我从DataSource 获得Connection 时,我应该手动关闭它吗?我的意思是如果我必须关闭它,它将如何在未来的请求中使用?
【问题讨论】:
标签: java jdbc datasource
从连接池获得的连接应该和普通连接一样使用。 JDBC 4.2 规范(第 11.1 节)提到了池:
当应用程序使用完一个连接后,它会关闭逻辑连接 使用方法
Connection.close。这会关闭逻辑连接,但不会 不关闭物理连接。相反,物理连接返回到 池,以便它可以重复使用。连接池对客户端是完全透明的:客户端获得一个池化的 连接并以同样的方式使用它获得和使用非池 连接。
(强调我的)
这意味着当您完成连接后,您始终调用Connection.close()!不管是物理连接还是池中的逻辑连接。
原因是连接是物理(直接)连接还是逻辑连接应该纯粹是配置问题,而不是仅使用连接的应用程序代码的问题。
在连接池的情况下,close() 将 - 细节可能会有所不同,并且一些实现在这方面存在错误 - 使逻辑连接无效并向连接池发出信号,表明底层物理连接可用于重新 -利用。连接池可能会做一些有效性检查,然后将(物理)连接返回到池中或关闭它(例如,如果池中有太多空闲连接,或者连接太旧等)。
调用close() 不仅是被允许的,它对于连接池的正确工作甚至是至关重要的。不调用close() 通常需要一些帮助线程来关闭(回收)已经使用太久的逻辑连接。由于此超时时间通常比正常应用程序需要的时间长,它可能会导致池耗尽,或者导致池需要的最大连接数比实际需要的更大。
【讨论】:
您应该关闭Connection 以将其返回到池中,下次您将要求从池中获取Datasource.getConnection() 连接。这里没有问题。
有时您不想在每次操作后关闭连接并为多个操作使用相同的连接。在这种情况下,您不应该在最后一次操作完成之前关闭它。
【讨论】:
对资源使用 try 以避免连接问题
try (Connection con = ds.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(...)) {...}
【讨论】: