我將ojdbc6.jar複製到tomcat安裝文件夾中的lib文件夾中。 當我在JDBC連接中部署使用Oracle驅動程序的Web應用程序時,服務器說無法找到驅動程序類,而且我不得不手動執行DriverManager.registerDriver,然後才能正常工作。如何在Tomcat 7.0.47啓動時註冊oracle jdbc驅動程序?
是否可以這樣做,驅動程序在啓動時註冊,我不必手動執行它既不創建連接池?
我將ojdbc6.jar複製到tomcat安裝文件夾中的lib文件夾中。 當我在JDBC連接中部署使用Oracle驅動程序的Web應用程序時,服務器說無法找到驅動程序類,而且我不得不手動執行DriverManager.registerDriver,然後才能正常工作。如何在Tomcat 7.0.47啓動時註冊oracle jdbc驅動程序?
是否可以這樣做,驅動程序在啓動時註冊,我不必手動執行它既不創建連接池?
您能說清楚「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。
在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的類加載器進行附加註冊,因爲它知道啓動過程中註冊時的類名。
是的,這就是我的意思:Tomcat根目錄下的lib文件夾。 但驅動程序不在WEB應用程序的WEB-INF/lib中,而是在tomcat根目錄的/ lib目錄中。 – tonlika
如果您使用JNDI數據源,並且您應該知道它屬於哪個數據源。部署在該Tomcat實例上的其他應用程序也需要它們。如果您不打算使用池化數據源,並堅持使用DataManager創建每個連接,可能很容易嘗試的是從/ lib中刪除JDBC JAR並將它們放回到/ WEB-INF/lib中以供您上下文。 – duffymo