我有一个奇怪的问题,其中两个带有Oracle JDBC驱动程序的Web应用程序会相互冲突。我必须将JDBC驱动程序JAR放在公共文件夹 TOMCAT_HOME / lib 中。这是什么原因?
答案 0 :(得分:77)
JDBC驱动程序在所有 Web应用程序共享的JVM范围单例DriverManager
中注册自己。如果您在两个不同的Web应用程序中使用相同的(在类名称中)JDBC驱动程序注册两次,则可能会导致您的问题。如果您的Web应用程序使用相同JDBC驱动程序的不同版本,则会出现更多问题。
此外,将JDBC驱动程序放入Tomcat的lib文件夹将有助于在重新部署Web应用程序时避免内存泄漏,而无需重新启动Tomcat,例如:如果您只是将新的WAR文件放入Tomcat的webapps文件夹中:
类DriverManager
由引导类加载器加载,从而在JVM中全局“生存”,而Tomcat在其自己的类加载器中加载所有Web应用程序。因此,如果来自Web应用程序的WEB-INF / lib文件夹的JDBC驱动程序在DriverManager
中注册自身,它会将该应用程序的类加载器固定在内存中(从而将该Web应用程序的所有类别)固定,从而防止其进行垃圾回收。 / p>
如果DriverManager
和JDBC驱动程序都来自非Web应用程序类加载器,则可以自由地重新部署Web应用程序,而无需将任何Web应用程序类固定在从其他类加载器加载的类中。
当前版本的Tomcat(可能是6.x,绝对是7.x)会在检测到内存泄漏(如JDBC驱动程序等)时,在取消部署Web应用程序时记录警告。