2013-11-26 130 views
4

我将ojdbc6.jar复制到tomcat安装文件夹中的lib文件夹中。 当我在JDBC连接中部署使用Oracle驱动程序的Web应用程序时,服务器说无法找到驱动程序类,而且我不得不手动执行DriverManager.registerDriver,然后才能正常工作。如何在Tomcat 7.0.47启动时注册oracle jdbc驱动程序?

是否可以这样做,驱动程序在启动时注册,我不必手动执行它既不创建连接池?

回答

3

您能说清楚“tomcat安装文件夹中的lib文件夹”是什么意思吗?它应该是直接在你的Tomcat根目录下的/ lib。

Tomcat 7 docs这样说:

因此,在他们的 WEB-INF/lib目录下的数据库驱动的Web应用程序可以不依赖于服务提供商机制 并且应该明确登记的驱动程序。

正确的做法是设置一个JNDI data source而不是使用DriverManager在您的代码中创建一个。

我也建议匹配的驱动程序版本到这两个Oracle和JVM版本。 JDK 6已经达到其支持生命的末期。 JDK 7是当前的产品。如果您使用的是JDK 7,我建议您使用ojdbc6.jar中的upgrading

+0

是的,这就是我的意思:Tomcat根目录下的lib文件夹。 但驱动程序不在WEB应用程序的WEB-INF/lib中,而是在tomcat根目录的/ lib目录中。 – tonlika

+1

如果您使用JNDI数据源,并且您应该知道它属于哪个数据源。部署在该Tomcat实例上的其他应用程序也需要它们。如果您不打算使用池化数据源,并坚持使用DataManager创建每个连接,可能很容易尝试的是从/ lib中删除JDBC JAR并将它们放回到/ WEB-INF/lib中以供您上下文。 – duffymo

2

在oracle的jdk 8_31上尝试使用ojdbc7.jar和tomcat 8.0.20时,我遇到了同样的问题。

我已经把ojdbc7.jar在$ CATALINA_BASE/lib目录的建议位置:http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html 然后预计Java的服务提供商机制使用Tomcat的“共同”类加载器注册驱动程序,但它不工作,司机不没有得到注册。

有点调试后,这似乎是Tomcat的JreMemoryLeakPreventionListener初始化一个“系统”的类加载器,而不是“共同”的类加载器的DriverManager(从Tomcat的代码):

// Use the system classloader as the victim for all this 
// ClassLoader pinning we're about to do. 
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); 

/* 
* First call to this loads all drivers in the current class 
* loader 
*/ 
if (driverManagerProtection) { 
    DriverManager.getDrivers(); 
} 

这里的问题是,系统类加载器(对我来说Oracle的启动$ AppClassLoader)具有以下类路径:

file:$CATALINA_BASE/bin/bootstrap.jar 
file:$CATALINA_BASE/bin/tomcat-juli.jar 

由于ojbc7.jar是不是在这个类路径中,没有服务提供商将由DriverManager的发现,让你的驱动程序仅可因为只有当DriverManager类被加载时(这是它的根本缺陷),扫描才从静态块完成。

我对解决这个问题的第一个想法是,增添ojdbc罐子系统的类加载器的类路径中Tomcat的$ CATALINA_BASE /斌/ setenv.sh像这样:

CLASSPATH=$CATALINA_BASE/lib/ojdbc7.jar 

这样,驾驶员使用注册JreMemoryLeakPreventionListener调用使用系统类加载器的服务提供者机制。

您必须非常小心,不要在您的webapp的类加载器中引入ojdbc驱动程序(例如,在您的WEB-INF/lib文件夹中包含ojdbc),因为这些类的优先级高于父类加载器的优先级。这有点复杂,但当它使用调用者的类加载器调用Class.forName时,DriverManager本身可能会导致驱动程序从webapp的类加载器进行附加注册,因为它知道启动过程中注册时的类名。

相关问题