2016-06-17 64 views
9

Java documentation的Class.forName似乎仍然需要

在JDBC的早期版本,以獲得一個連接,你首先必須通過調用方法Class.forName初始化JDBC驅動程序。

自動加載在類路徑中找到的任何JDBC 4.0驅動程序。 (但是,您必須手動加載之前,JDBC 4.0任何驅動程序與方法Class.forName。)

我有一個連接到SQL Server Express 2016年澤西島的Webservice它sqljdbc42.jar是4.2驅動程序,在CLASSPATH

但是,如果我省略了Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")電話,我DriverManager.getConnection拋出一個SQLException(發現JDBC沒有合適的驅動程序:SQLSERVER://本地主機:1433; ......「)

getConnection開始一旦我添加了Class.forName電話就成功了。

我在Java 8上。

我在想什麼?

更新:我剛試過一個命令行程序,它的工作原理沒有forName。但是,在我的Eclipse IDE中,我正在將本地REST服務作爲本地主機上的Tomcat 8.0服務器運行,但它不起作用。

+1

*「... sqljdbc42.jar這是4.0驅動程序」* [這裏證明](https://msdn.microsoft.com/en-us/library/ms378422(v = sql.110).aspx),對於任何其他懷疑論者。 :-)嗯,好吧,它不是4.0驅動程序,它是4.2驅動程序,但... –

+1

@TJCrowder更新:-) – user93353

+1

如果是這樣似乎微軟不喜歡遵循標準 –

回答

6

由於SPI(服務提供商接口),當類DriverManager本身初始化時,驅動程序會自動初始化。這意味着它將在內部嘗試查找上下文類加載器中可用的任何文件META-INF/services/java.sql.Driver,並且對於找到的每個文件,它將創建文件中定義的類的實例,在本例中該實例實際上是JDBC驅動程序的FQN ,這是JDBC驅動程序從JDBC 4.0開始自動初始化的方式。

但是,只有當初始化類DriverManager時,您的驅動程序可從上下文類加載器中使用時,才能使用。確保這樣的一種好方法就是讓您的驅動程序在層次結構中足夠高的Class Loader。在你的情況下,你應該把你的驅動程序放在tomcat/lib。事實上,這樣你的驅動程序將可以從Common CL得到,它應該足夠高。有關Tomcat here中CL層次結構的更多詳細信息。

相關問題