2013-11-26 153 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的類加載器進行附加註冊,因爲它知道啓動過程中註冊時的類名。

相關問題