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

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

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

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

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

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

当前版本的Tomcat(可能是6.x和绝对7.x)会logging有关Web应用程序的取消部署的警告,如果检测到内存泄漏,则由JDBC驱动程序执行。