【问题标题】:How to close a jdbc connection created through Spring?如何关闭通过 Spring 创建的 jdbc 连接?
【发布时间】:2012-12-17 19:32:50
【问题描述】:

我已经构建了一个应用程序 (app1),它查看并记录数据库中的某些字段。此应用程序与另一个应用程序 (app2) 共享数据库,该应用程序在启动时需要单独连接,但一旦启动 (app2) 就可以允许其他连接到数据库。在我的应用程序(app1)中,我使用 Spring 创建了一个 dao 对象来连接到数据库,显然,连接永远不会关闭,这导致 app2 在启动时崩溃。根据我的阅读,Spring 应该自动处理打开和关闭它管理的所有数据库连接。我不确定我可以分享任何代码来帮助更好地描绘我的问题,但如果需要一些代码,我会发布我能做的。感谢您的帮助。

【问题讨论】:

  • Spring 会关闭它的连接,但是如果你有一个连接池,这个池可能会保持对数据库的实际物理连接打开。
  • 我想这就是我需要关闭的地方,我将在哪里/如何做到这一点?
  • 这取决于您使用的特定服务器/连接池。它可能具有在每次使用后强制关闭物理连接的设置。请注意,这会降低应用程序的性能。
  • 你的 jdbc 模板 bean 中有 destroy-method 属性吗?

标签: java spring jdbctemplate


【解决方案1】:

如果您使用的是 JDBC 模板,则不必担心显式关闭连接,Spring 将负责在内部管理连接池并从该池中获取/释放连接。

【讨论】:

  • 如果 Spring 像 GriffeyDog 所说的那样在池中保持连接处于活动状态,我可以进去并以某种方式关闭它吗?
  • 为什么要这样做,那么连接池的用途是什么。
  • @lancex 你似乎误解了连接池的使用——这个想法是精确地保持连接打开而不关闭它们,只是“释放”它们以供将来使用.这样您就不必为一遍又一遍地重新建立连接而付出代价。
  • 你说得对,我不太明白它的用法。如果它真的按照您描述的方式使用连接池,它是否仍然会导致 app2 看到打开的连接然后失败?
  • @lancex 我不知道您的环境的具体情况,这两个应用程序都使用 Spring 吗?他们使用相同的模板配置吗?池是否正确配置?它是否定义了足够的数据库连接来服务这两个应用程序?
【解决方案2】:

在应用程序之间共享连接时,我建议使用连接池。连接的打开和关闭可以通过注释(@Transactional)的声明性事务划分来完成。

http://faheemsohail.com/2012/01/configuring-c3p0-connection-pooling-with-spring-and-hibernate/

【讨论】:

    【解决方案3】:

    这对你有用吗?

     public  void closeCon() {
    
      {
       if (con != null)
        try {
         con.close();
    
        } catch (SQLException e) {
         e.printStackTrace();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 2011-04-10
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多