總所周知,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!");
}
}
如今來看看DM的registerDriver作什麼(它是一個靜態的而且是同步的方法)
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