【问题标题】:Should I close a Connection obtained from a DataSource manually?我应该手动关闭从数据源获得的连接吗?
【发布时间】:2014-05-30 14:48:15
【问题描述】:

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

【问题讨论】:

    标签: java jdbc datasource


    【解决方案1】:

    从连接池获得的连接应该和普通连接一样使用。 JDBC 4.2 规范(第 11.1 节)提到了池:

    当应用程序使用完一个连接后,它会关闭逻辑连接 使用方法Connection.close。这会关闭逻辑连接,但不会 不关闭物理连接。相反,物理连接返回到 池,以便它可以重复使用。

    连接池对客户端是完全透明的:客户端获得一个池化的 连接并以同样的方式使用它获得和使用非池 连接

    (强调我的)

    这意味着当您完成连接后,您始终调用Connection.close()!不管是物理连接还是池中的逻辑连接。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 补充一点:JDBC 规范明确指出:“连接池对客户端是完全透明的:客户端获得一个池连接并使用它,就像它获得和使用一个非池连接。”(JDBC 4.2 规范,第 11.1 节)
      【解决方案3】:

      对资源使用 try 以避免连接问题

      try (Connection con = ds.getConnection();
          Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(...)) {...}
      

      【讨论】:

        猜你喜欢
        • 2011-07-21
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        相关资源
        最近更新 更多