【问题标题】:DBCP Close all opened connectionsDBCP 关闭所有打开的连接
【发布时间】:2016-10-11 11:59:56
【问题描述】:

我正在使用 dbcp 连接池并有长时间运行的存储过程。打开了几个连接,并且数据库(mssql)服务器机器关闭,这使这些连接保持打开状态。如何从池中获取打开的连接列表并从我的 Java Web 应用程序手动关闭它们?

InitialContext initCtx = new InitialContext();
            Object obj = initCtx.lookup("java:comp/env/jdbc/oscon");
            BasicDataSource source = (BasicDataSource) obj;

我正在使用 commons-dbcp2-2.0.1.jar

【问题讨论】:

    标签: java database apache-commons-dbcp mssql-jdbc


    【解决方案1】:

    您无需手动关闭它们。最好的办法就是配置Connection testing,在这种情况下,c3p0 会默默地(但懒惰地)关闭旧的连接并获取新的连接。

    如果您想更加主动,只需在 c3p0 数据源上调用 hardReset()(在将其转换为 PooldedDataSource 之后。

    【讨论】:

    • 将 BasicDataSource 转换为 PooledDataSource 的方法是什么?
    • InitialContext initCtx = new InitialContext();对象 obj = initCtx.lookup("java:comp/env/jdbc/oscon"); BasicDataSource 源 = (BasicDataSource) obj; PooledDataSource pds = (PooledDataSource) DataSources.pooledDataSource(source); pds.hardReset();
    • c3p0 不提供 BasicDataSource。查找后,直接尝试PooledDataSource pds = (PooledDataSource) obj;。然后硬重置,就像你做的那样。
    • 您所做的一切都不应该创建一个新的数据源或连接池(除非第一个尚未初始化)。查找将找到 DataSource 的现有实例,如果它存在于您的 JVM 和 ClassLoader 中。您没有使用 DataSources 工厂类来创建新实例,这些文档是无关紧要的。您的实例来自 JNLP,但是您已经对其进行了配置和设置。
    • 对不起,它的 dbcp 不是 c3p0。我改变了主要描述。你能给我同样的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多