You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
privatefinalstaticCopyOnWriteArrayList<DriverInfo> registeredDrivers = newCopyOnWriteArrayList<>();
publicstaticsynchronizedvoidregisterDriver(java.sql.Driverdriver)
throwsSQLException {
registerDriver(driver, null);
}
publicstaticsynchronizedvoidregisterDriver(java.sql.Driverdriver,
DriverActionda)
throwsSQLException {
/* Register the driver if it has not already been added to our list */if(driver != null) {
registeredDrivers.addIfAbsent(newDriverInfo(driver, da));
} else {
// This is for compatibility with the original DriverManagerthrownewNullPointerException();
}
println("registerDriver: " + driver);
}
JDBC Driver注册
JDBC的核心接口之一是
java.sql.Driver
,每一个驱动都必须提供实现类,那么它是怎样和DriverManager一起为我们提供数据库连接服务的呢,首先看一段经典的连接JDBC的代码.那么这段代码究竟做了什么神奇的操作呢,我们直接进去
DriverManager
这个类一看究竟,可以看到构造器是私有的,从而阻止我们去初始化这个类,JVM加载这个类之后首先会调用它的static
代码段,DriverManager的static段调用了loadInitialDrivers()方法。
第一部分
这段代码首先会去获取jdbc.drivers这个系统属性,可以通过
或者在代码中显示设置
然后会通过ServiceLoader加载驱动程序,在JDBC4中,驱动程序必须在
META-INF/services/
包含java.sql.Driver
这个文件,在其中包含数据库驱动的实现类,比如Mysql的中包含的内容是:
第二部分
然后会加载找到的所有驱动程序,这个时候会调用驱动程序的static代码块,我们去看一下Mysql和H2数据库的Driver实现类在其中做了什么操作:
可以看到其中的共同点是都调用了DriverManager.registerDriver()去注册自己,其做的操作是将Driver封装成DriverInfo放到一个列表中保存。
第三部分
如果判断drivers为空,说明没有通过jdbc.drivers找到驱动类,接着有没有通过ServiceLoader找到驱动类并初始化都无所谓了,直接返回即可,如果drivers不为空,则通过Class.forName()去加载驱动类,
调用static代码块去注册自己,同时通过
String[] driversList = drivers.split(":");
可以看出,指定jdbc.drivers
指定驱动时可以给出多个,用:
分隔。获取连接
经过上面这段代码,DriverManager已经初始化完毕,各个驱动也已经注册完成,接着就调用getConnection()去获取连接,其核心代码也很容易理解,就是调用connect()方法去建立连接
The text was updated successfully, but these errors were encountered: