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

Ole*_*nko 11 java datasource jdbc

当我收到了ConnectionDataSource,我应该手动关闭它?我的意思是,如果我必须关闭它,它将如何在未来的请求中使用?

Mar*_*eel 14

从连接池获得的连接应与正常连接完全相同.关于池的JDBC 4.2规范(第11.1节)说:

使用连接完成应用程序时,它会使用该方法关闭逻辑连接Connection.close.这会关闭逻辑连接但不会关闭物理连接.而是将物理连接返回到池中,以便可以重用它.

连接池对客户端完全透明:客户端获取池连接并使用它与获取和使用非池连接的方式相同.

(强调我的)

这意味着当你完成连接后,你总是打电话Connection.close()!无论是物理连接还是池中的逻辑连接都无关紧要.

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

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

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


小智 5

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

  • 除此之外:JDBC 规范明确指出:_“连接池对客户端来说是完全透明的:客户端获取池化连接并使用它,就像获取和使用非池化连接一样。”_(JDBC 4.2 规范,第 11.1 节) (3认同)