關於Class.forName(“com.mysql.jdbc.Driver”)

來源:互聯網
上載者:User

傳統的使用jdbc來訪問資料庫的流程為:
Class.forName(“com.mysql.jdbc.Driver”);
String url = “jdbc:mysql://localhost:3306/test?user=root&password=123456″;
Connection con = DriverManager.getConnection(url);
Statement statement = con.createStatement();

最開始使用的時候,不明白為什麼首先要載入一個驅動類,之後就可以取得了Connection了,很好奇DriverManager是怎麼獲得那個驅動類的資訊,後來看了下com.mysql.jdbc.Driver這個類的原始碼,豁然開朗了。原來在com.mysql.jdbc.Driver類中有這麼一段靜態初始化代碼:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException(“Can’t register driver!”);
}
}
也就是,在Class.forName載入完驅動類,開始執行靜態初始化代碼時,會自動建立一個Driver的對象,並調用DriverManager.registerDriver把自己註冊到DriverManager中去。

ps1: Class.forName(String) 與ClassLoader.loadClass(String)的區別
Class.forName(String): 載入類,並且執行類初始化;可以通過Class.forName(String, boolean, ClassLoader)第二個參數來僅僅載入類不執行初始化;
ClassLoader.loadClass(String): 僅僅載入類,不執行類初始化;

ps2: 有時會看到這種用法:
Class.forName(“com.mysql.jdbc.Driver”).newInstance();
這是沒有必要的,正如前述,靜態初始化已經new了一個Driver的對象,註冊到DriverManager中去,在此再建立一個Driver對象則是完全沒有必要的,浪費空間。

ps3: 結合ps1,Class.forName(“com.mysql.jdbc.Driver”);相當於:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class cls = loader.loadClass(“com.mysql.jdbc.Driver”);
cls.newInstance();
這種方法的問題同ps2, 浪費了一個Driver對象;

ps4: 在java 6中,引入了service provider的概念,即可以在設定檔中配置service(可能是一個interface或者abstract class)的provider(即service的實作類別)。配置路徑是:/META-INF/services/下面。詳細資料見:http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider
而java.sql.DriverManager也添加了對此的支援,因此,在JDK6中,DriverManager的尋找Driver的範圍為:
1)system property “jdbc.drivers” 中配置的Driver值;
2)使用者調用Class.forName()註冊的Driver
3)service provider設定檔java.sql.Driver中配置的Driver值。
因此,在jdk6中,其實是可以不用調用Class.forName來載入mysql驅動的,因為mysql的驅動程式jar包中已經包含了java.sql.Driver設定檔,並在檔案中添加了com.mysql.jdbc.Driver.但在JDK6之前版本,還是要調用這個方法。

參考文檔:
1)http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/DriverManager.html
2)http://docs.oracle.com/javase/6/docs/api/index.html?java/sql/DriverManager.html
3)http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.