我担心我在理解 Java 中的连接池方面存在一个基本问题。
我使用 IDBCDataSource 作为连接池。在我的应用程序的入口点,我实例化了一个 BasicDataSource,例如 setMaxActive=50。然后将该 DataSource 的实例传递给某些业务逻辑使用的各种 DAO。
每个 DAO 调用 getConnection(),但没有调用单个 close()。我的假设是,在不使用 DAO 后,垃圾收集器会关闭连接。
我的问题是我不断地用完连接(即等待可用连接的代码)。
现在假设我将在每个数据库操作结束时添加一个 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();
}
}