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()
,而不是在展开的物理连接上。
我正在使用 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()
,而不是在展开的物理连接上。