2010-09-26 55 views

回答

4

現代JDBC驅動程序都應該在自己的jar文件清單提供足夠的元數據,所以你可能不需要做任何事情。

Class#forName主要的一點是,除去特定的JDBC驅動程序編譯時的依賴(並使其配置在運行時)。如果您在程序中始終使用Oracle驅動程序代碼(以使用其非標準JDBC擴展)並且沒有強制驅動程序類名的強制代碼,那麼您也可以創建驅動程序類的常規實例。

new oracle.jdbc.driver.OracleDriver(); 
+0

該死的,我正要寫那個:),但它不是他們註冊的清單文件。 – Daniel 2010-09-26 07:47:05

+1

@丹尼爾:雖然我從來沒有見過這樣的作品。 – Thilo 2010-09-26 07:50:06

+0

Thilo,之前我沒有看到那個工作。但我相信這在Java 1.6中得到了修復,因爲我只是檢查了它並且工作正常。 +1。 – Daniel 2010-09-26 19:33:35

1

通常情況下,你可以創建它的一個實例,但導致硬依賴於特定的驅動程序。

是做什麼用的Class.forName的原因是因爲你可以把它配置。它工作的原因是因爲它觸發了要運行的類的靜態初始化器,它允許它使用jdbc進行註冊。

總之,據我所知,你有兩個選擇:

  • 的Class.forName - 允許配置的驅動程序 - 漂亮的
  • 直接實例 - 創建固體類的依賴 - 不是很好
9

現代司機並不需要註冊,因爲他們有一個META-INF /服務/ java.sql.Driver中文件聲明司機的存在,通過包含驅動程序的名稱類。

只需使用DriverManager.getConnection(...),並發現驅動程序本身。


編輯 @Thilo:我只是在PostgreSQL測試它,和它的作品:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class JdbcDriverLoadTest { 

    public static void main(String[] args) throws SQLException { 
     Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5434/IKOffice_Core", "ik", "ik0000"); 
     System.out.println(c.getMetaData().getDatabaseProductName()); 
    } 

} 
+2

但是,您的應用程序需要正確記錄,最終用戶應該使用此[java.util.ServiceLoader']提供完整的JDBC 4兼容驅動程序(http://download.oracle.com/javase/6/docs/ api/java/util/ServiceLoader.html)功能,否則應用程序可能無法工作。迄今爲止,並非所有主要的JDBC驅動程序供應商都已經實現了這一點我仍然依靠'Class#forName()'並在完全殺死Class#forName()之前的一年或兩年後重新評估JDBC驅動程序的世界。 – BalusC 2010-09-26 19:46:34

1

您還可以將驅動程序類添加到系統屬性jdbc.drivers這是冒號名單分開的驅動程序類名,DriverManager類加載。

實施例:

java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver MyApp 

來源:DriverManager javadocs

0

com.mysql.jdbc.Driver dr = null;

相關問題