当我从Connection
获得DataSource
时,是否应该手动关闭它?我的意思是,如果我必须关闭它,它将如何在未来的请求中使用?
答案 0 :(得分:13)
从连接池获得的连接应与正常连接完全相同。 JDBC 4.2规范(第11.1节)说明了汇集:
当应用程序使用连接完成时,它会关闭逻辑连接 使用方法
Connection.close
。这会关闭逻辑连接,但确实如此 没有关闭物理连接。相反,物理连接返回到 池,以便它可以重复使用。连接池对客户端完全透明:客户端获取池 连接和以与获取相同的方式使用它,使用非池化 连接强>
(强调我的)
这意味着当你完成连接后,你总是打电话给Connection.close()
!如果它是物理连接或来自池的逻辑连接并不重要。
原因是连接是物理(直接)连接还是逻辑连接应该纯粹是配置问题,而不是仅仅使用连接的应用程序代码的问题。
对于连接池,close()
将 - 细节可能会有所不同,并且某些实现在这方面存在错误 - 使逻辑连接无效并向连接池发出信号,表明底层物理连接可用于再利用。连接池可以进行一些有效性检查,然后将(物理)连接返回到池中或关闭它(例如,如果池中有太多空闲连接,或者连接太旧,等等)。
不仅允许调用close()
,对于正确使用连接池甚至至关重要。不调用close()
通常需要一些辅助线程来关闭(回收)已经使用太久的逻辑连接。由于此超时通常比正常的应用程序需求更长,因此可能导致池耗尽,或者导致池需要比实际需要更高的最大连接数的配置。
答案 1 :(得分:2)
您应该关闭Connection
以便将其返回到池中,下次您将要求从池中获取Datasource.getConnection()
连接。这里没有问题。
有时您不希望在每次操作后关闭连接,并对多个操作使用相同的连接。在这种情况下,您不应该关闭它,直到上次操作完成。
答案 2 :(得分:0)
对资源使用 try 以避免连接问题
try (Connection con = ds.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(...)) {...}