当前位置: 首页 > 知识库问答 >
问题:

Java连接池-垃圾回收机制或调用关闭()?

卜鹏
2023-03-14

我担心的是,我在理解Java中的连接池时遇到了一个根本问题。

我正在使用IDBCataSource作为连接池。在我的应用程序的入口点,我实例化了一个BasicDataSource,例如setMaxActive=50。然后将该数据源的实例传递到各种DAO中,这些DAO由一些业务逻辑使用。

每个DAO都调用getConnection(),但没有调用单个close()。我的假设是,在不使用DAO之后,垃圾收集器会关闭连接。

我的问题是,即时通讯不断运行的连接(即代码等待可用的连接)。

现在让我们假设我将在每个html" target="_blank">数据库操作的末尾添加一个close()调用。抛出异常时会发生什么。我必须捕获DAO中的每个异常,确保关闭连接,然后重新抛出发生的异常!

示例-当前方法:

public class MyDAO {
     private Connection con;

     public MyDAO (DataSource ds) {
          con = ds.getConnection();     
     }     

     public MyReturnClass execSomeQuery() throws SQLException {
          String sql = String.format("SELECT * FROM foo");
          PreparedStatement ps = con.prepareStatement(sql);
          ResultSet rs = ps.executeQuery();

          while (rs.next()) {
               …     
               ...
          }          

          return result;
     }
}


public class MyAppLogic() {
     DataSource ds; 

     public MyAppLogic(DataSource ds) {
          this.ds = ds;
     }

     public void doSomeStuff() {
          MyDAO myDAO = MyDAO(ds);
          myDAO.execSomeQuery();
     }
}

共有2个答案

左丘元徽
2023-03-14

您可以创建一个包装器或父类来管理连接,这样就不必在每个方法中复制逻辑。这里有一个例子(请注意,我实际上并没有编译或测试这个)。

public interface DAOClass {
    public void execSomeQuery() throws SQLException;
}

public class MyDAOWrapper {
    private DAOClass dao;
    private DataSource ds;

    public MyDAOWrapper(DataSource ds, DAOClass dao) {
        this.dao = dao;
        this.ds = ds;
    }

    public void exec() throws SQLException {
        Connection con = ds.getConnection();
        try {
            dao.execSomeQuery();
        }
        finally {
            con.close();
        }
    }

}

// usage
    public void doSomeStuff() throws SQLException {
        MyDAOWrapper dao = new MyDAOWrapper(ds, new MyDAO());
        dao.exec();
    }

关于错误处理,除非捕获异常,否则不需要重新抛出异常。您的last子句应该关闭连接(如果存在),当该连接退出时,异常将继续向上传播。

try {
  do_something();
}
finally {
  cleanup();
  // throw is not necessary
}
锺离飞鸣
2023-03-14

您需要关闭连接,以便它们返回到连接池中。GC不会调用关闭您的连接!

 类似资料:
  • 本文向大家介绍Python垃圾回收机制?相关面试题,主要包含被问及Python垃圾回收机制?时的应答技巧和注意事项,需要的朋友参考一下 引用计数 标记清除 分代回收  

  • 主要内容:总结通过前几节对可利用空间表进行动态存储管理的介绍,运行机制可以概括为: 当用户发出申请空间的请求后,系统向用户分配内存;用户运行结束释放存储空间后,系统回收内存。这两部操作都是在用户给出明确的指令后,系统对存储空间进行有效地分配和回收。 但是在实际使用过程中,有时会因为用户申请了空间,但是在使用完成后没有向系统发出释放的指令,导致存储空间既没有被使用也没有被回收,变为了 无用单元或者会产生 悬挂访问

  • Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。 1 引用计数 PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象

  • 本文向大家介绍JS的垃圾回收机制?相关面试题,主要包含被问及JS的垃圾回收机制?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: GC(garbage collection),GC执行时,中断代码,停止其他操作,遍历所有对象,对于不可访问的对象进行回收,在V8引擎中使用两种优化方法, 分代回收,2、增量GC,目的是通过对象的使用频率,存在时长来区分新生代和老生代对象,多回收新生代区,少回收老

  • 主要内容:1 什么是Java 垃圾回收,2 Java 垃圾回收的优势,3 如何取消对象引用,4 finalize()方法,5 gc()方法,6 Java 垃圾回收的例子1 什么是Java 垃圾回收 在Java中,垃圾意味着未引用的对象。 垃圾回收是自动回收运行时未使用的内存的过程。换句话说,这是销毁未使用对象的一种方法。 我们在C语言中使用free() 函数,在C ++中使用delete()。但是,在Java中它是自动执行的。因此,java提供了更好的内存管理。 2 Java 垃圾回收的优势 它

  • 问题内容: 我想知道Java中发生的垃圾回收。它真的能够处理所有未使用的对象并释放最大可能的内存吗? 我还想知道Java垃圾收集与另一种语言(例如C#)相比如何?然后,如何自动垃圾收集与从像C这样的语言中进行手动收集相比又能达到更好的效果呢? 问题答案: 是的,这就是垃圾收集的重点。 有许多不同形式的垃圾收集。如果不增强算法,最简单的形式即引用计数就无法处理某些类型的垃圾(循环引用)。 Java(