我正在使用org.apache.commons.dbcp.BasicDataSource
作为我的数据源实现,我的代码geting连接并关闭连接,如下所示:
Connection conn = dataSource.getConnection();
当我完成连接工作后,我将关闭它
conn.close();
我的问题是:conn.close()
非常接近,所以当连接像conn.close()
一样关闭时,数据源是如何做的。我听说数据源连接关闭并不是很接近,只是发布,但是我找不到数据源类的发布API。我想知道datasource如何管理数据库连接的创建,关闭和发布。
顺便提一下:数据源如何刷新连接,我的意思是如果数据源的连接未使用一年,数据源如何保持连接可用?
答案 0 :(得分:2)
DataSource
(javax.sql.DataSource
)表示可以从中获取数据库连接的抽象概念。
因此,DataSource
本身并未定义如何管理连接的任何细节,DataSource
的不同实现可能以不同方式管理连接:
一个天真的实现(例如Spring的DriverManagerDataSource
)可能会在每次请求时创建一个新连接,在这种情况下close()
实际上会关闭连接。
由连接池(例如Apache DBCP或c3p0)支持的实现从池中返回现有连接。此类实现返回的Connection
对象是一个代理,并且它的close()
方法被覆盖以返回到池的连接而不是关闭它。
如果您想知道连接池管理连接的确切程度,请检查documentation of your connection pool implementation。
答案 1 :(得分:0)
对来自数据源的连接的close()
调用不一定会关闭数据库连接。它只会返回到池的连接以供重用。这样做的方式是,与数据库的实际连接使用PooledConnection
类进行修饰,并覆盖此close()
上的PooledConnection
方法,只是将连接标记为可用。