Tomcat JDBC连接池(释放连接)

时间:2013-05-07 07:25:12

标签: java jdbc tomcat7 connection-pooling

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

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

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

我也试过这样做ConnectionPool aPool = datasource.createPool(); 但是我发现这个aPool上没有任何类似的发布连接。

我想我在这里错过了一些东西? 感谢您的帮助。

来自Tomcat JBDC connection pool的代码段:

            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 个答案:

答案 0 :(得分:7)

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

这已在Closing JDBC Connections in Pool

中得到解答

答案 1 :(得分:3)

好吧,我的坏,我没有看到DataSource的实施。 它扩展DataSourceProxy,在内部创建一个池,然后根据Connection

返回PoolProperties

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

如果有人另有想法,请添加评论/回复。

答案 2 :(得分:2)

该示例仅显示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连接池的情况下,a   应用程序时创建Connection对象池   服务器(或其他一些服务器)启动。然后管理这些对象   由池管理器根据请求分散连接   客户端并在确定客户端时将它们返回到池中   用Connection对象完成。大量的家务管理   参与管理这些联系。

     

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