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

Connection.close() on C3P0NativeJdbcExtractor closes the connection and removes it from the Pool

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

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

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

但是,如果我们关闭未包装的连接,那么它将 returned 到池中。

是否有原因导致此处关闭包装连接无法return连接到池?

像 c3p0 这样的连接池包含由 JDBC 驱动程序创建的一组物理 ('native') 连接。当您向它请求连接时,它会将该物理连接包装在代理中,也称为逻辑连接。

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

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

您几乎没有理由像那样提取本机连接。唯一的原因是当您需要访问 driver-specific 功能时。您应该尽可能使用标准的 JDBC,只有在您确实需要时才解包以访问 driver-specific 功能。

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