我正在使用C3P0NativeJdbcExtractor来提取本机JDBC连接,如下所示。
public Connection getNativeConnection() throws SQLException{
C3P0NativeJdbcExtractor nativeJbdc;
nativeJbdc = new C3P0NativeJdbcExtractor();
return nativeJbdc.getNativeConnection(dataSource.getConnection());
}
请注意,此处的数据源是从C3P0连接池获得的。当我在此方法上返回Connection.close()
时,它实际上是关闭连接而不是返回池。
但是,如果我们关闭展开的连接,那么它将返回到Pool。
为什么在此处关闭包装连接无法将连接返回到池中,是否有理由?
答案 0 :(得分:3)
像c3p0这样的连接池包含由JDBC驱动程序创建的物理(“本机”)连接的集合。当您要求连接时,它会将该物理连接包装在代理中,也称为逻辑连接。
该代理将拦截某些方法,如Connection.close()
。对于close()
而不是关闭连接,它会使逻辑连接无效,因此它表现为已关闭的连接,并返回到连接池的物理连接。
您的代码从逻辑连接中提取物理连接,并返回该代码,因此如果您在其上调用close()
,则实际上会关闭与数据库的连接,而不是将其返回到池中。
你应该几乎没有理由提取这样的原生连接。唯一的原因是您需要访问特定于驱动程序的功能。您应该尝试尽可能多地使用标准JDBC,并且只在需要时才打开以访问特定于驱动程序的功能。
当您致电close()
时,请确保在从连接池收到的逻辑连接上呼叫close()
,而不是在未打开的物理连接上。