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

时间:2017-02-11 18:28:22

标签: jdbc connection-pooling c3p0

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

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

请注意,此处的数据源是从C3P0连接池获得的。当我在此方法上返回Connection.close()时,它实际上是关闭连接而不是返回池。

但是,如果我们关闭展开的连接,那么它将返回到Pool。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

你应该几乎没有理由提取这样的原生连接。唯一的原因是您需要访问特定于驱动程序的功能。您应该尝试尽可能多地使用标准JDBC,并且只在需要时才打开以访问特定于驱动程序的功能。

当您致电close()时,请确保在从连接池收到的逻辑连接上呼叫close(),而不是在未打开的物理连接上。