一尘不染

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

tomcat

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


阅读 625

收藏
2020-06-16

共1个答案

一尘不染

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

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

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

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

当前版本的Tomcat(可能是6.x,最好是7.x)将在未部署Web应用程序时记录警告,如果检测到内存泄漏,则由JDBC驱动程序进行。

2020-06-16