Java JDBC连接池管理
我使用Java JDBC连接池管理,java,jdbc,datasource,connection-pooling,Java,Jdbc,Datasource,Connection Pooling,我使用org.apache.commons.dbcp.BasicDataSource作为我的数据源实现,我的代码获取连接并关闭连接,如下所示: Connection conn = dataSource.getConnection(); 当我完成连接工作时,我将关闭它 conn.close(); 我的问题是:conn.close()确实是关闭的,所以当连接像conn.close()一样关闭时,数据源是如何工作的。我听说datasource连接close不是真正的close,只是release,
org.apache.commons.dbcp.BasicDataSource
作为我的数据源实现,我的代码获取连接并关闭连接,如下所示:
Connection conn = dataSource.getConnection();
当我完成连接工作时,我将关闭它
conn.close();
我的问题是:conn.close()
确实是关闭的,所以当连接像conn.close()
一样关闭时,数据源是如何工作的。我听说datasource连接close不是真正的close,只是release,但是我在datasource类中找不到release API。我想知道datasource如何管理数据库连接的创建、关闭和释放
顺便问一个小问题:datasource如何刷新连接,我的意思是,如果datasource的连接已经一年没有使用,datasource如何保持连接可用?对来自datasource的连接调用close()
并不一定关闭数据库连接。它只会返回到池的连接以供重用。这样做的方式是,到数据库的实际连接被一个PooledConnection
类修饰,这个PooledConnection
上的close()
方法被覆盖,只将连接标记为可用。DataSource
(javax.sql.DataSource
)表示可以从中获取数据库连接的抽象概念
因此,DataSource
本身没有定义如何管理连接的任何细节,而DataSource
的不同实现可能以不同的方式管理连接:
- 一个简单的实现(例如Spring的
)可能会在每次请求时创建一个新连接,在这种情况下DriverManager数据源
实际上会关闭连接close()
- 由连接池(如ApacheDBCP或c3p0)支持的实现从连接池返回现有连接<这种实现返回的code>Connection对象是一个代理,它的
方法被重写以返回到池的连接,而不是关闭它close()
如果您想知道您的连接池是如何管理连接的,请检查。Hi-Axtavt,谢谢您的回答,很抱歉我附加了一个小问题,connectionpool如何保持每个连接可用,我认为通过刷新连接或定期ping数据库?@Jack:这取决于连接池的实现。对于Apache DBCP,请参见上面的文档链接,
PooledConnection
表示池中的物理连接,它创建一个逻辑连接
(例如一个普通物理连接的代理,该连接在Close()
上执行其他操作)。该逻辑连接随后由数据源分发给用户。