DriverManager.deregisterDriver(驱动程序)是否关闭所有连接?

时间:2017-08-28 07:01:17

标签: java tomcat jdbc connection-pooling tomcat-dbcp

我需要在上下文被破坏时关闭所有tomcat连接池的数据源连接。 DriverManager.deregisterDriver(driver)关闭所有连接吗?

Enumeration<Driver> enumDrivers = DriverManager.getDrivers();
while (enumDrivers.hasMoreElements()) {
   Driver driver = enumDrivers.nextElement();
   DriverManager.deregisterDriver(driver);
}

1 个答案:

答案 0 :(得分:3)

以下是JDK 8上DriverManager.deregisterDriver(Driver driver)的代码:

DriverInfo aDriver = new DriverInfo(driver, null);
if(registeredDrivers.contains(aDriver)) {
    if (isDriverAllowed(driver, Reflection.getCallerClass())) {
        DriverInfo di = registeredDrivers.get(registeredDrivers.indexOf(aDriver));
        // If a DriverAction was specified, Call it to notify the
        // driver that it has been deregistered
        if(di.action() != null) {
           di.action().deregister();
        }
        registeredDrivers.remove(aDriver);
    } else {
        // If the caller does not have permission to load the driver then
        // throw a SecurityException.
        throw new SecurityException();
    }

请注意,它只是从列表中删除DriverInfo实例(registeredDrivers)。如果找到与驱动程序关联的DriverAction,则会调用driverAction.deregister()。从方法的docs

  

deregister方法仅供JDBC驱动程序使用,而不是由应用程序使用。建议JDBC驱动程序不要在公共类中实现DriverAction如果在调用deregister方法时存在与数据库的活动连接,则关于连接是关闭还是允许继续,具体实现。调用此方法后,具体实现是驱动程序是否可以限制创建与数据库的新连接的能力,调用其他Driver方法或抛出SQLException。有关其行为的其他信息,请参阅JDBC驱动程序的文档。

所以在所有情况下,你都不应指望这一点,除非你完全确定底层实现。但这会使你的应用程序与它结合起来。