取消注册从 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 应用程序使用 JNDI DataSource 或 JCA 连接器而不是 DriverManager 的原因之一。另请注意,DriverManager 将自动在类路径上重新加载符合 JDBC 4+ 的驱动程序。 我知道,如果一个tomcat实例包含多个web应用,并且给自己注册了一个驱动,那么每个应用都可以使用它。如果其中一个取消注册该驱动程序,则它对所有其他应用程序都不可用。这就是我不再注册或注销任何东西并倾向于在生产环境中使用 JNDI 数据源的原因。 @MarkRotteveel 感谢您对Datasources 的建议,但是已经给出了数据库连接代码,我不会碰它,至少现在不会。我正在通过 ServletContextListener 在应用程序关闭时取消注册驱动程序,但感谢有关自动重新加载的提示。 @SergeBallesta 那么,DriverManager 不会绑定到应用程序类加载器吗?如何判断特定类正在使用哪个类加载器? @watery DriverManager 本身由该类加载器加载。 【参考方案1】:

除非 Tomcat 因其中一个已注册的驱动程序而抱怨内存泄漏,否则不要理会它们。如果 Tomcat 抱怨,那么 - 假设没有其他东西在使用它们 - 取消注册有问题的驱动程序。

【讨论】:

是的,事实上是这样。但是通过查看this answer,我发现我不应该从DriverManager 注销它们,因为该类在所有Web 应用程序之间共享。

以上是关于取消注册从 DriverManager.getDrivers() 返回的驱动程序可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 Wordpress 取消注册自定义帖子类型

CSS 从Google Libraries API加载最新版本的jQuery并取消注册Wordpress版本

取消注册推送通知

无法取消注册 ble 通知的 dbus 信号

取消注册和重新注册 GCM 消息会导致两个 regId 有效。这是预期的吗?

.NET Core 身份作为 UI 取消注册