2017-08-28 186 views
2

我需要关闭所有的tomcat连接池的数据源连接,同时上下文被销毁。 DriverManager.deregisterDriver(driver)是否关闭所有连接?DriverManager.deregisterDriver(驱动程序)是否关闭所有连接?

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

它可能不是 –

+1

不,它不。 [Javadoc](https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html)中没有关于它的信息。如果连接池是上下文的一部分,它将被上下文销毁,并且它应该释放进程中的所有空闲连接。你不必对此做任何事情。在任何情况下,如果你使用连接池,你使用的是'DataSource',而不是'DriverManager'。 – EJP

+0

您绝对不应该调用'deregisterDriver',这是JDBC驱动程序自己注销的,而不是 - 至少不是典型的 - 用于应用程序代码。 –

回答

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(); 
    } 

注意,它只是从一个列表(registeredDrivers)删除DriverInfo实例。如果它发现与驱动程序相关的DriverAction,它会调用driverAction.deregister()。从方法的docs

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

因此,在所有情况下,除非您完全确定底层实现,否则不应该指望这一点。但是这会使你的应用程序与之耦合。