JDBC-MYSQL源碼學習1

總所周知,JAVA給鏈接不一樣數據庫定義了一個JDBC標準接口,由各個數據庫廠商按此標準本身實現,供開發人員調用,對此一直以來比較好奇,以前因爲能 力有限沒有勇氣去看源代碼,不過最終仍是「好奇害死貓」。對MYSQL的JDBC源碼在初步緩慢的學習,因爲知識和認知度有限,有錯誤請你們多多支出,並 一塊兒討論,謝謝。
     今天從最初加載Mysql的Driver類開始,這句話【Class.forName("com.mysql.jdbc.Driver");】你們應該不會陌生吧,具體這句話作了什麼呢?呵呵,看下 Driver的源代碼就能夠知道了。
    com.mysql.jdbc.Driver的源碼解釋以下(    一部分):
  /**
  * When a Driver class is loaded, it should create an instance of itself and
  * register it with the DriverManager. This means that a user can load and
  * register a driver by doing Class.forName("foo.bah.Driver")
    **/
com.mysql.jdbc.Driver基礎了com.mysql.jdbc.NonRegisteringDriver和實現了java.sql.Driver,而檔咱們運行Class.forName("com.mysql.jdbc.Driver");這句話時候,實際上是讓JVM類加載器加載此類到JVM中,同時會初始化此類,在初始化此類的時候會運行 Driver的這塊代碼,並幫本身註冊到 DriverManager
 static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

 如今來看看DMregisterDriver作什麼(它是一個靜態的而且是同步的方法)
  public static synchronized void registerDriver(java.sql.Driver driver){
        if (!initialized) {
            initialize();
        }
        DriverInfo di = new DriverInfo();

       di.driver = driver;
      di.driverClass = driver.getClass();
      di.driverClassName = di.driverClass.getName();

     // Not Required -- drivers.addElement(di);

     writeDrivers.addElement(di);
     println("registerDriver: " + di);
   
     /* update the read copy of drivers vector */
     readDrivers = (java.util.Vector) writeDrivers.clone();
}
1.判斷driver是否初始化,若是沒有初始化就調用 Initialize()。
2.DriverInfo類記錄Driver的信息,並放入writerDrivers(Vector)集合中
3.writerDrivers的拷貝對象給與readDrivers(Vector)集合

 具體看看類初始化作了什麼
  Initialize()調用了 loadInitialDrivers()
   這裏估計是JAVA的安全性特權檢查,預計和獲取system.property("jdbc.drivers")同樣都是返回property的value 。

    String drivers;
      try {
        drivers = (String) java.security.AccessController.doPrivileged(
        new sun.security.action.GetPropertyAction("jdbc.drivers"));
        } catch (Exception ex) {
            drivers = null;
        }

       // If the driver is packaged as a Service Provider,
        // load it.
       
        // Get all the drivers through the classloader
        // exposed as a java.sql.Driver.class service.
   
     DriverService ds = new DriverService();

     // Have all the privileges to get all the
     // implementation of java.sql.Driver
     java.security.AccessController.doPrivileged(ds);       
    
       println("DriverManager.initialize: jdbc.drivers = " + drivers);
        if (drivers == null) {
            return;    //本人調試發如今這裏會返回NULL 而不繼續解析和加載,可是最後仍是能夠成功獲取數據庫數據,想知道爲何?請看學習2中將講解。
        }
        while (drivers.length() != 0) {
            int x = drivers.indexOf(':');
            String driver;
            if (x < 0) {
                driver = drivers;
                drivers = "";
            } else {
                driver = drivers.substring(0, x);
                drivers = drivers.substring(x+1);
            }
            if (driver.length() == 0) {
                continue;
            }
            try {
                println("DriverManager.Initialize: loading " + driver);
                Class.forName(driver, true,
                  ClassLoader.getSystemClassLoader());

            } catch (Exception ex) {
                println("DriverManager.Initialize: load failed: " + ex);
            }
        }
  以上紅色字符就是把MYSQ驅動類加載到JVM中的地方
  到目前爲止就是把MYSQL的Driver的加載到JVM的代碼了,  預告下次發佈的是怎麼調用鏈接MYSQL數據庫的學習代碼。

  但願你們一塊兒討論,謝謝!
java

相關文章
相關標籤/搜索