Tomcat JDBC连接池(释放连接)

Posted

技术标签:

【中文标题】Tomcat JDBC连接池(释放连接)【英文标题】:Tomcat JDBC connection pool (releasing connection) 【发布时间】:2013-05-01 01:51:50 【问题描述】:

参考Tomcat JBDC connection pool,我在其中给出的独立Java 示例中看到,使用datasource.getConnection() 获得连接,这很酷。但在 finally 块中,它显示con.close()

问题:当我实现这个时,很明显我从数据源获得的con 每次都会在finally 中关闭。当这个关闭时,连接池机制是否会获取一个新的连接并将其添加到池中?

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

我也试过这样做ConnectionPool aPool = datasource.createPool(); 但我发现在这个aPool 上没有像发布连接那样的东西。

我想我在这里遗漏了什么? 感谢您的帮助。

来自Tomcat JBDC connection pool的代码sn-p:

            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) 
            

【问题讨论】:

【参考方案1】:

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

Closing JDBC Connections in Pool已经回答了这个问题

【讨论】:

保持 DataSource 的“MaxIdle”设置足够高以使这些连接不被关闭。我猜将它设置为 0 将关闭任何关闭的连接。【参考方案2】:

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

我明白,由这个 DataSource 来处理连接,即使我最终关闭了con,DataSource 也可能会采取必要的行动。

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

【讨论】:

【参考方案3】:

该示例仅显示how to create and use a data source。对于 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();
    ...

引用How connection pooling works in Java and JDBC:

连接池通过执行创建工作来运行 提前连接,对于 JDBC 连接池,一个 连接对象池是在应用程序时创建的 服务器(或其他一些服务器)启动。然后管理这些对象 由池管理器根据请求分散连接 客户端并在它确定客户端时将它们返回到池中 完成了 Connection 对象。大量的家务是 参与管理这些连接。

连接池服务器启动时,会创建一个预定的 连接对象的数量。然后客户端应用程序将执行 用于检索对 DataSource 对象的引用的 JNDI 查找 实现 ConnectionPoolDataSource 接口。客户端 应用程序不需要做出任何特殊规定即可使用 汇集数据源;代码与编写的代码没有什么不同 对于非池化数据源。

【讨论】:

以上是关于Tomcat JDBC连接池(释放连接)的主要内容,如果未能解决你的问题,请参考以下文章

配置Tomcat服务器数据连接池

Tomcat JDBC连接池(Tomcat 9)

数据库连接池与JDBC的区别

Spring boot (11) tomcat jdbc连接池

如何记录 Tomcat 7 JDBC 连接池、连接创建

Java做数据库连接池的时候加载oracle的JDBC驱动时总是提示找不到驱动类