我有一个奇怪的问题,两个带有 Oracle JDBC 驱动程序的 Web 应用程序会相互冲突。我必须将 JDBC 驱动程序 JAR 放在 common 文件夹中TOMCAT_HOME/lib。这是什么原因呢?
JDBC 驱动程序在 JVM 范围的单例中注册自己DriverManager http://download.oracle.com/javase/6/docs/api/java/sql/DriverManager.html共享者all网络应用程序。如果您有相同的(如类名)的 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 驱动程序来自非 Web 应用程序类加载器,您可以自由地重新部署 Web 应用程序,而无需任何 Web 应用程序类将自身固定在从其他类加载器加载的类中。
当前版本的 Tomcat(可能是 6.x,肯定是 7.x)将在 JDBC 驱动程序检测到内存泄漏时记录有关取消部署 Web 应用程序的警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)