2013-05-07 202 views
7

参考Tomcat JBDC connection pool,我看到在那里给出的独立java示例中,有一个使用datasource.getConnection()这个很酷的连接。但在最后一块,它说con.close()Tomcat JDBC连接池(释放连接)

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

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

回答

7

既然你调用了关于池获得的方法的close()函数,那么这个方法调用内部要做些什么。它不一定需要关闭池式数据库连接 - 它可能会进行一些清理,然后将连接添加回池中。

这在Closing JDBC Connections in Pool

+0

保持DataSource的“MaxIdle”设置足够高,以使这些连接不被关闭。将它设置为0会关闭任何关闭的连接,我想。 – Hartmut 2014-09-07 20:36:25

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连接池的情况下的工作操作时,被创建的连接对象的 池在应用程序 服务器(或某个其他服务器)启动时。这些对象随后由池管理器管理 ,池管理器在客户端请求 客户端时分散连接,并在确定客户端使用Connection对象完成了 后将其返回给池。管理这些连接涉及很多家务活动,其中包括 。

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

3

OK,我的坏已经回答了,我没有看到DataSource实施。 它扩展DataSourceProxy那久违基础上,PoolProperties

我明白Connection之前在内部创建一个池,其高达这个数据源来处理连接,即使我在最后关闭con,数据源可以采取必要的行动。

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