DriverManager.registerDriver(new com.mysql.jdbc.Driver())爲什麼Driver會創建兩次

在學習JDBC的時候,通常有兩種方式去註冊數據庫驅動程序(這裏採用MySQL數據庫),分別爲:
Java代碼
1. DriverManager.registerDriver(new Driver());
2. Class.forName(“com.mysql.jdbc.Driver”);
那麼這兩種方式有什麼異同呢?首先我們到DriverManager中去看一下,
Java代碼
1. public static synchronized void registerDriver(java.sql.Driver driver)
2. throws SQLException {
3. if (!initialized) {
4. initialize();
5. }
6.
7. DriverInfo di = new DriverInfo();
8.
9. di.driver = driver;
10. di.driverClass = driver.getClass();
11. di.driverClassName = di.driverClass.getName();
12.
13. // Not Required – drivers.addElement(di);
14.
15. writeDrivers.addElement(di);
16. println(“registerDriver: ” + di);
17.
18. /* update the read copy of drivers vector */
19. readDrivers = (java.util.Vector) writeDrivers.clone();
20.
21. }
很明顯,DriverManager將我們需要註冊的驅動程序信息封裝成DriverInfo放進了一個writeDrivers中,這個writeDrivers是DriverManager中聲明的一個static類型Vector變量。在getConnection的時候會再用到。
那麼Class.forName(“com.mysql.jdbc.Driver”)是如何註冊驅動程序的呢,我們知道Class.forName(“類名”)的主要作用是向虛擬機實例化一個Class實例,我們看一下com.mysql.jdbc.Driver的源代碼。
Java代碼
1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
2. // ~ Static fields/initializers
3. // ———————————————
4.
5. //
6. // Register ourselves with the DriverManager
7. //
8. static {
9. try {
10. java.sql.DriverManager.registerDriver(new Driver());
11. } catch (SQLException E) {
12. throw new RuntimeException(“Can’t register driver!”);
13. }
14. }
在 com.mysql.jdbc.Driver中有一段靜態代碼塊,是向 DriverManager註冊一個Driver實例。這樣在Class.forName(“com.mysql.jdbc.Driver”)的時候,就會首先去執行這個靜態代碼塊,於是和DriverManager.registerDriver(new Driver())有了相同的效果。
那麼對於這兩種方法,在這裏,推薦使用第二種,即Class.forName(“類名”)的方式。原因有兩點
1、在我們執行DriverManager.registerDriver(new Driver())的時候,靜態代碼塊也已經執行了,相當於是實例化了兩個Driver對象。
2、 DriverManager.registerDriver(new Driver())產生了一種對MySQL的一種依賴。而Class.forName的方式我們完全可以在運行的時候再動態改變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章