7

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

问题:当我实现这个时,很明显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) {}
            }
4

3 回答 3

7

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

这已经在关闭池中的 JDBC 连接中得到解答

于 2013-05-07T12:33:23.430 回答
3

好的,我的错,我没有看到DataSource. 它扩展了在返回 a 之前在DataSourceProxy内部创建一个池ConnectionPoolProperties

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

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

于 2013-05-08T04:56:52.313 回答
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();
    ...

引用来自连接池在 Java 和 JDBC 中的工作原理

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

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

于 2013-05-07T12:27:57.643 回答