参考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) {}
}
答案 0 :(得分:7)
由于您在池中获取的方法上调用close(),因此在此方法调用中要执行的操作是什么。它不一定必须关闭池化数据库连接 - 它可能会进行一些清理,然后将连接添加回池中。
中得到解答答案 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接口。客户端 申请不需要做任何特殊规定来使用 汇总数据源;代码与编写的代码没有什么不同 对于非池化数据源。