DriverManager#getConnection 关键代码如下, 他的逻辑就是循环所有通过 SPI 注册进来的 driver, 挨个建立 connection, 看哪次能建立成功就直接返回
for(DriverInfo aDriver : registeredDrivers) {
// If the caller does not have permission to load the driver then
// skip it.
if(isDriverAllowed(aDriver.driver, callerCL)) {
try {
println(" trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
if (con != null) {
// Success!
println("getConnection returning " + aDriver.driver.getClass().getName());
return (con);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
} else {
println(" skipping: " + aDriver.getClass().getName());
}
}
其实是可以通过 jdbcUrl 定位的是哪个 driver 的
java.sql.Driver#acceptsURL 其实就是做这个作用的, 我看了MySQL, PgSQL的 Driver 源码, 都是实现了这个方法, 其实上面在循环获取 connection 之前, 做这个判断就ok了
if(aDriver.driver.acceptsURL(url){
Connection con = aDriver.driver.connect(url, info);
}
我估计是历史原因????????
目测是的,至少 hikari 的实现,那连接不是这么拿的