2017-08-28 184 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驅動程序文檔以獲取有關其行爲的更多信息。

因此,在所有情況下,除非您完全確定底層實現,否則不應該指望這一點。但是這會使你的應用程序與之耦合。