【问题标题】:JDBC connection pool managementJDBC连接池管理
【发布时间】:2023-03-29 00:30:01
【问题描述】:

我使用org.apache.commons.dbcp.BasicDataSource 作为我的数据源实现,我的代码获取连接并关闭连接,如下所示:

Connection conn = dataSource.getConnection();

当我完成连接工作后,我将关闭它

conn.close();

我的问题是:conn.close() 真的很接近,所以当连接像conn.close() 一样关闭时,数据源的情况如何。我听说数据源连接关闭并不是真的关闭,只是发布,但我无法从数据源类中找到发布API。我想知道datasource是如何管理数据库连接的创建、关闭和释放的。

顺便提个小问题:datasource是如何刷新连接的,我的意思是如果datasource的connections已经一年没有使用了,datasource是如何保持connection可用的呢?

【问题讨论】:

    标签: java jdbc datasource connection-pooling


    【解决方案1】:

    DataSource (javax.sql.DataSource) 表示您可以从中获取数据库连接的抽象概念。

    所以,DataSource 本身并没有定义如何管理连接的任何细节,DataSource 的不同实现可能以不同的方式管理连接:

    • 一个简单的实现(例如 Spring 的 DriverManagerDataSource)可能会在您每次请求时创建一个新连接,在这种情况下 close() 实际上会关闭连接。

    • 由连接池(如 Apache DBCP 或 c3p0)支持的实现从池中返回现有连接。这种实现返回的Connection 对象是一个代理,它的close() 方法被重写以返回到池的连接而不是关闭它。

    如果您想知道您的连接池是如何管理连接的,请查看documentation of your connection pool implementation。

    【讨论】:

    • 您好 Axtavt,感谢您的回答,很抱歉附加了一个小问题,connectionpool 如何保持每个连接可用,我认为是通过刷新连接或定期 ping 数据库?
    • @Jack:这取决于连接池的实现。对于 Apache DBCP,请参阅上面的文档链接和 stackoverflow.com/questions/4950396/…
    【解决方案2】:

    对来自数据源的连接的close() 调用不一定会关闭数据库连接。它只会将连接返回到池以供重用。这样做的方法是,与数据库的实际连接使用 PooledConnection 类修饰,并且此 PooledConnection 上的 close() 方法被覆盖,仅将连接标记为可用。

    【讨论】:

    • PooledConnection 表示池中的物理连接,它创建一个逻辑Connection(例如,一个普通的物理Connection 的代理,它在Close() 上执行其他操作)。然后这个逻辑连接由数据源分发给用户。
    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多