【问题标题】:Connection.close() on C3P0NativeJdbcExtractor closes the connection and removes it from the PoolC3P0NativeJdbcExtractor 上的 Connection.close() 关闭连接并将其从池中删除
【发布时间】:2017-02-11 18:28:21
【问题描述】:

我正在使用 C3P0NativeJdbcExtractor 来提取本机 JDBC 连接,如下所示。

public Connection getNativeConnection() throws SQLException{
        C3P0NativeJdbcExtractor nativeJbdc;
        nativeJbdc = new C3P0NativeJdbcExtractor();
        return nativeJbdc.getNativeConnection(dataSource.getConnection());
    }

注意这里的数据源是从一个C3P0连接池中获取的。当我在这个方法上返回一个Connection.close() 时,它实际上是在关闭连接而不是返回到池中。

但是,如果我们关闭未包装的连接,则它会返回到池中。

为什么在此处关闭包装的连接无法将连接返回到池中是否有原因?

【问题讨论】:

    标签: jdbc connection-pooling c3p0


    【解决方案1】:

    像 c3p0 这样的连接池包含由 JDBC 驱动程序创建的物理(“本机”)连接的集合。当您要求它建立连接时,它会将该物理连接包装在代理中,也称为逻辑连接。

    该代理将拦截某些方法,例如Connection.close()。对于close(),它不是关闭连接,而是使逻辑连接无效,因此它表现为关闭连接,并将物理连接返回到连接池。

    您的代码从逻辑连接中提取物理连接,然后将其返回,因此如果您对此调用 close(),实际上是关闭了与数据库的连接,而不是将其返回到池中。

    您几乎不应该有理由像这样提取本机连接。唯一的原因是当您需要访问特定于驱动程序的功能时。您应该尽可能地使用标准 JDBC,并且仅在真正需要时才打开包装以访问特定于驱动程序的功能。

    当您调用close() 时,请确保您在从连接池收到的逻辑连接上调用close(),而不是在未包装的物理连接上。

    【讨论】:

    • 这是我一直在寻找的,感谢您的帮助。我们使用标准 JDBC 的原因是未知的本机连接用于进行包调用。在此期间,我们使用 nativeC3P0Extractor 从数据源检索连接。
    猜你喜欢
    • 2015-03-28
    • 2012-06-14
    • 2016-11-21
    • 2020-07-09
    • 2022-06-24
    • 2021-08-01
    • 2011-06-23
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多