C3P0NativeJdbcExtractor 上的 Connection.close() 关闭连接并将其从池中删除

Posted

技术标签:

【中文标题】C3P0NativeJdbcExtractor 上的 Connection.close() 关闭连接并将其从池中删除【英文标题】:Connection.close() on C3P0NativeJdbcExtractor closes the connection and removes it from the Pool 【发布时间】: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() 时,它实际上是在关闭连接而不是返回到池中。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

这是我一直在寻找的,感谢您的帮助。我们使用标准 JDBC 的原因是未知的本机连接用于进行包调用。在此期间,我们使用 nativeC3P0Extractor 从数据源检索连接。

以上是关于C3P0NativeJdbcExtractor 上的 Connection.close() 关闭连接并将其从池中删除的主要内容,如果未能解决你的问题,请参考以下文章

电脑上GetTickCount64在哪里

.htaccess:在所有页面上强制 www,在一个页面上强制 https,在所有其他页面上强制 http

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?

地理定位在笔记本电脑上工作,但不在智能手机上

键盘上的PERIOD键在啥地方?

工作上996,生活上669,并不是什么难事儿!