2014-10-03 39 views
3

我正在處理一個Java web應用程序,該應用程序將在其他通用servlet容器(本例中爲Tomcat 7)上進行部署。取消註冊從DriverManager.getDrivers()返回的驅動程序可以嗎?

該清除代碼註銷其所有註冊的JDBC驅動程序(保存在自定義數據庫連接管理器的本地變量中)。

但是,如果我在此之後致電DriverManager.getDrivers(),我發現其他司機仍然返回。

是否可以取消註冊,或者該方法是否將同一個servlet容器(本例中爲Tomcat)中的其他應用程序註冊的驅動程序返回?

+0

從技術上講,不應該觸摸已註冊的驅動程序,儘管在託管容器的情況下事情會變得更加棘手。這是您應該直接從Web應用程序使用JNDI'DataSource'或JCA連接器而不是'DriverManager'的原因之一。還要注意''DriverManager'會自動重新加載類路徑中JDBC 4+兼容的驅動程序。 – 2014-10-03 15:05:18

+1

我知道,如果一個tomcat實例包含多個web應用程序,並且註冊了它自己的驅動程序,它可用於每個應用程序。如果其中一人取消註冊該驅動程序,則其他所有應用程序都無法使用該驅動程序。這就是爲什麼我不再註冊或取消註冊任何內容,傾向於在生產環境中使用JNDI數據源的原因。 – 2014-10-03 15:13:30

+0

@MarkRotteveel感謝您提供關於'Datasource'的建議,但數據庫連接代碼已經給出,我不會觸及它,至少現在不會。我通過ServletContextListener在應用程序關閉時取消註冊驅動程序,但感謝關於自動重新加載的提示。 – watery 2014-10-03 19:01:28

回答

1

除非Tomcat正在抱怨由於其中一個註冊驅動程序而導致的內存泄漏,否則不要使用它們。如果Tomcat正在抱怨 - 假設沒有其他人在使用它們 - 取消註冊違規驅動程序。

+0

是的,實際上是這樣。但通過查看[這個答案](http://stackoverflow.com/a/7198049/3127111),我發現我不應該從'DriverManager'註銷它們,因爲這個類是在所有Web應用程序之間共享的。 – watery 2014-10-03 20:04:21

相關問題