繁体   English   中英

Tomcat JDBC连接池(释放连接)

[英]Tomcat JDBC connection pool (releasing connection)

参考Tomcat JBDC连接池 ,我在那里给出的独立java示例中看到,使用datasource.getConnection()获取连接很酷。 但在finally块中,它表示con.close()

问题:当我实现这一点时,似乎显而易见的是,每次在finally中都会关闭来自datasource的con 关闭时,连接池机制是否会获取新连接并将其添加到池中?

我认为应该有一个像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) {}
            }

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

Closing JDBC Connections in Pool中已经解决了这个问题

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

据我所知,它依靠这个DataSource来处理连接,即使我最终关闭了con ,DataSource也可能采取必要的行动。

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

该示例仅显示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();
    ...

引用连接池如何在Java和JDBC中工作

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM