這裏是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驅動程序自己註銷的,而不是 - 至少不是典型的 - 用於應用程序代碼。 –