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

zjf*_*fdu 41 tomcat jdbc

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

Phi*_*art 80

JDBC驱动程序在JVM范围的单例中注册自己,该单例DriverManager所有 Web应用程序共享.如果您在两个不同的Web应用程序中使用相同的(在类名称中)JDBC驱动程序注册两次,则可能会导致您的问题.如果您的Web应用程序使用相同JDBC驱动程序的不同版本,则会出现更多问题.

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

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

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

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

  • 它只是我,还是"JVM范围的单例DriverManager"似乎是JDBC设计中的一个主要错误? (22认同)