gpt4 book ai didi

tomcat - 为什么 JDBC 驱动程序必须放在 TOMCAT_HOME/lib 文件夹中?

转载 作者:行者123 更新时间:2023-11-28 21:43:44 25 4
gpt4 key购买 nike

我有一个奇怪的问题,即两个带有 Oracle JDBC 驱动程序的 Web 应用程序会相互冲突。我必须将 JDBC 驱动程序 JAR 放在公共(public)文件夹 TOMCAT_HOME/lib 中。这是什么原因?

最佳答案

JDBC 驱动程序在 JVM 范围的单例中注册自己 DriverManager所有 网络应用程序共享。如果您有相同的(如在类名中)JDBC 驱动程序从两个不同的 Web 应用程序注册两次,这可能会导致您的问题。如果您的 Web 应用程序使用同一 JDBC 驱动程序的不同版本,问题就更大了。

此外,将 JDBC 驱动程序放入 Tomcat 的 lib 文件夹将有助于防止在不重新启动 Tomcat 的情况下重新部署 Web 应用程序时发生内存泄漏,例如如果您只是将一个新的 WAR 文件放入 Tomcat 的 webapps 文件夹中:

DriverManager 类由引导类加载器加载,因此在 JVM 中全局“存在”,而 Tomcat 在其自己的类加载器中加载所有 Web 应用程序。因此,如果 Web 应用程序的 WEB-INF/lib 文件夹中的 JDBC 驱动程序在 DriverManager 中注册自身,它将在内存中固定该 Web 应用程序的类加载器(以及该 Web 应用程序的所有类),防止其产生垃圾收藏。

如果 DriverManager 和 JDBC 驱动程序都来自非网络应用程序类加载器,您可以自由地重新部署您的网络应用程序,而无需任何网络应用程序类将自己固定在从其他类加载器加载的类中。

如果检测到内存泄漏,当前版本的 Tomcat(可能是 6.x,肯定是 7.x)将记录关于取消部署 Web 应用程序的警告,其中包括 JDBC 驱动程序。

关于tomcat - 为什么 JDBC 驱动程序必须放在 TOMCAT_HOME/lib 文件夹中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6981564/

25 4 0