这里是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驱动程序文档以获取有关其行为的更多信息。
因此,在所有情况下,除非您完全确定底层实现,否则不应该指望这一点。但是这会使你的应用程序与之耦合。
它可能不是 –
不,它不。 [Javadoc](https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html)中没有关于它的信息。如果连接池是上下文的一部分,它将被上下文销毁,并且它应该释放进程中的所有空闲连接。你不必对此做任何事情。在任何情况下,如果你使用连接池,你使用的是'DataSource',而不是'DriverManager'。 – EJP
您绝对不应该调用'deregisterDriver',这是JDBC驱动程序自己注销的,而不是 - 至少不是典型的 - 用于应用程序代码。 –