取消注册从 DriverManager.getDrivers() 返回的驱动程序可以吗?
Posted
技术标签:
【中文标题】取消注册从 DriverManager.getDrivers() 返回的驱动程序可以吗?【英文标题】:Is it fine to deregister drivers returned from DriverManager.getDrivers()? 【发布时间】:2014-10-03 14:32:47 【问题描述】:我正在开发一个 Java webapp,该应用程序将部署在一个通用 servlet 容器(本例中为 Tomcat 7)上。
该清理代码取消注册其所有已注册的 JDBC 驱动程序(保存在自定义数据库连接管理器的本地变量中)。
但如果我在那之后调用DriverManager.getDrivers()
,我看到其他驱动程序仍然返回。
是否也可以注销它们,或者该方法是否返回由其他应用程序在同一 servlet 容器(本例中为 Tomcat)中注册的驱动程序?
【问题讨论】:
从技术上讲,您不应该接触已注册的驱动程序,尽管在托管容器的情况下事情会变得更加棘手。这是您应该直接从 Web 应用程序使用 JNDIDataSource
或 JCA 连接器而不是 DriverManager
的原因之一。另请注意,DriverManager
将自动在类路径上重新加载符合 JDBC 4+ 的驱动程序。
我知道,如果一个tomcat实例包含多个web应用,并且给自己注册了一个驱动,那么每个应用都可以使用它。如果其中一个取消注册该驱动程序,则它对所有其他应用程序都不可用。这就是我不再注册或注销任何东西并倾向于在生产环境中使用 JNDI 数据源的原因。
@MarkRotteveel 感谢您对Datasource
s 的建议,但是已经给出了数据库连接代码,我不会碰它,至少现在不会。我正在通过 ServletContextListener 在应用程序关闭时取消注册驱动程序,但感谢有关自动重新加载的提示。
@SergeBallesta 那么,DriverManager
不会绑定到应用程序类加载器吗?如何判断特定类正在使用哪个类加载器?
@watery DriverManager 本身由该类加载器加载。
【参考方案1】:
除非 Tomcat 因其中一个已注册的驱动程序而抱怨内存泄漏,否则不要理会它们。如果 Tomcat 抱怨,那么 - 假设没有其他东西在使用它们 - 取消注册有问题的驱动程序。
【讨论】:
是的,事实上是这样。但是通过查看this answer,我发现我不应该从DriverManager
注销它们,因为该类在所有Web 应用程序之间共享。以上是关于取消注册从 DriverManager.getDrivers() 返回的驱动程序可以吗?的主要内容,如果未能解决你的问题,请参考以下文章
CSS 从Google Libraries API加载最新版本的jQuery并取消注册Wordpress版本