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() 关闭连接并将其从池中删除的主要内容,如果未能解决你的问题,请参考以下文章
.htaccess:在所有页面上强制 www,在一个页面上强制 https,在所有其他页面上强制 http