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

时间:2014-05-30 14:48:15

标签: java jdbc datasource

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

3 个答案:

答案 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(...)) {...}