我需要在上下文被破坏时关闭所有tomcat连接池的数据源连接。 DriverManager.deregisterDriver(driver)
关闭所有连接吗?
Enumeration<Driver> enumDrivers = DriverManager.getDrivers();
while (enumDrivers.hasMoreElements()) {
Driver driver = enumDrivers.nextElement();
DriverManager.deregisterDriver(driver);
}
答案 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驱动程序的文档。
所以在所有情况下,你都不应指望这一点,除非你完全确定底层实现。但这会使你的应用程序与它结合起来。