Java 如何在Tomcat 7.0.47启动时注册oracle jdbc驱动程序?

Java 如何在Tomcat 7.0.47启动时注册oracle jdbc驱动程序?,java,oracle,tomcat,jdbc,driver,Java,Oracle,Tomcat,Jdbc,Driver,我将ojdbc6.jar复制到tomcat安装文件夹中的lib文件夹中。 当我部署在JDBC连接中使用Oracle驱动程序的Web应用程序时,服务器说找不到驱动程序类,我被迫手动执行DriverManager.registerDriver,然后它就可以工作了 可以这样做吗?这样驱动程序在启动时注册,我就不必手动操作,也不必创建连接池?您能澄清一下“tomcat安装文件夹中的lib文件夹”是什么意思吗?它应该表示Tomcat根目录下的/lib 政府说: 因此,具有数据库驱动程序的web应用程序 W

我将ojdbc6.jar复制到tomcat安装文件夹中的lib文件夹中。 当我部署在JDBC连接中使用Oracle驱动程序的Web应用程序时,服务器说找不到驱动程序类,我被迫手动执行DriverManager.registerDriver,然后它就可以工作了


可以这样做吗?这样驱动程序在启动时注册,我就不必手动操作,也不必创建连接池?

您能澄清一下“tomcat安装文件夹中的lib文件夹”是什么意思吗?它应该表示Tomcat根目录下的/lib

政府说:

因此,具有数据库驱动程序的web应用程序 WEB-INF/lib目录不能依赖于服务提供程序机制 并应明确登记驾驶员

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


我还建议将驱动程序版本与Oracle和JVM版本相匹配。JDK 6已经到了其支持生命周期的末尾。JDK 7是当前的产品。如果您正在使用JDK 7,我建议您使用ojdbc6.jar。

在oracle的JDK 831上尝试将ojdbc7.jar与tomcat 8.0.20结合使用时,我也遇到了同样的问题

我将ojdbc7.jar放在$CATALINA_BASE/lib中,如下所示: 然后期望java的服务提供者机制使用tomcat的“公共”类加载器注册驱动程序,但它不起作用,驱动程序也没有注册

经过一点调试后,tomcat的JreMemoryLeakPreventionListener似乎从“系统”类加载器而不是“公共”类加载器(从tomcat的代码)初始化DriverManager:

这里的问题是系统类加载器(在我的例子中是oracle的Launcher$AppClassLoader)具有以下类路径:

file:$CATALINA_BASE/bin/bootstrap.jar
file:$CATALINA_BASE/bin/tomcat-juli.jar
由于ojbc7.jar不在此类路径中,DriverManager不会发现任何服务提供程序,因此只能显式注册驱动程序,因为只有在加载DriverManager类时才从静态块执行扫描(这是它的基本缺陷)

我解决这个问题的第一个想法是将ojdbc jar添加到tomcat的$CATALINA_BASE/bin/setenv.sh中的系统类加载器类路径中,如下所示:

CLASSPATH=$CATALINA_BASE/lib/ojdbc7.jar
这样,就可以使用系统类加载器从JreMemoryLeakPreventionListener调用中使用服务提供程序机制注册驱动程序


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

是的,这就是我的意思:Tomcat根目录下的lib文件夹。但是驱动程序不在WEB应用程序的WEB-INF/lib中,而是在tomcat根目录的/lib中。如果您使用JNDI数据源,并且您应该这样做,那么它们就属于那里。部署在该Tomcat实例上的其他应用程序也需要它们。如果您不打算使用池数据源,并且坚持使用DataManager创建每个连接,那么简单的做法可能是从/lib中删除JDBC JAR,并将它们放回/WEB-INF/lib中以用于您的上下文。
CLASSPATH=$CATALINA_BASE/lib/ojdbc7.jar