Tomcat JDBC连接池(释放连接)

7

参考Tomcat JBDC连接池,在给出的独立Java示例中,我们可以使用datasource.getConnection()获取连接,这很酷。但在finally块中,它说con.close()

问题:当我实现时,似乎显而易见从数据源获取的con将在每次finally中关闭。当这个连接被关闭时,连接池机制会获取一个新连接并将其添加到池中吗?

我认为应该有一个像releaseConnection()之类的方法调用,让池自行决定是关闭它还是让它保持开放以供其他用途。

我也尝试过这样做: ConnectionPool aPool = datasource.createPool();但我发现aPool中没有像释放连接这样的东西。

我想我漏掉了什么? 感谢您的帮助。

来自Tomcat JBDC连接池的代码片段:

            DataSource datasource = new DataSource();
            datasource.setPoolProperties(p); 

            Connection con = null;
            try {
              con = datasource.getConnection();
              Statement st = con.createStatement();
              ResultSet rs = st.executeQuery("select * from user");
              int cnt = 1;
              while (rs.next()) {
                  System.out.println((cnt++)+". Host:" +rs.getString("Host")+
                    " User:"+rs.getString("User")+" Password:"+rs.getString("Password"));
              }
              rs.close();
              st.close();
            } finally {
              if (con!=null) try {con.close();}catch (Exception ignore) {}
            }
3个回答

7

当您在池中获得的方法上调用close()时,由池决定在此方法调用内部执行什么操作。它不一定要关闭池化的数据库连接-可能进行一些清理,然后将连接添加回池中。

这个问题已经在关闭JDBC连接池中得到了解答。


保持DataSource的“MaxIdle”设置足够高,以使那些未关闭的连接不被关闭。将其设置为0将关闭任何已关闭的连接,我猜。 - Hartmut Pfarr

3

好的,我的错,我没有看到DataSource的实现。 它扩展了DataSourceProxy,在返回基于PoolPropertiesConnection之前内部创建一个池。

我明白了,由这个DataSource处理连接,即使我在finally中关闭了conDataSource可能会采取必要的操作。

如果有人认为不同,请添加评论/回复。


2

这个例子只展示了如何创建和使用数据源。如果在Tomcat上使用连接池,你可以配置JNDI

// Sample
public static Connection getConnectionFromPool() {
    Context initCtx = new InitialContext();
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB");
    return ds.getConnection();
    ...

摘自Java和JDBC中连接池的工作原理

连接池通过提前执行创建连接的工作来运行,在JDBC连接池的情况下,在应用程序服务器(或其他服务器)启动时创建了一个Connection对象池。这些对象然后由池管理器进行管理,当客户端请求它们并确定客户端已经完成对Connection对象的使用时,将其分散连接并返回到池中。管理这些连接涉及大量的系统维护。

当连接池服务器启动时,它会创建一定数量的Connection对象。然后,客户端应用程序将执行JNDI查找以检索实现ConnectionPoolDataSource接口的DataSource对象的引用。客户端应用程序不需要做任何特殊规定来使用池化数据源;其代码与为非池化DataSource编写的代码没有区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接