2

I need to close all tomcat connection pool's datasource connections while context destroyed. Is DriverManager.deregisterDriver(driver) closes all connections?

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

1 回答 1

3

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

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(). 从方法的文档中:

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

因此,在所有情况下,您都不应该指望这一点,除非您绝对确定底层实现。但这会使您的应用程序与它过于耦合。

于 2017-08-28T07:06:04.423 回答