DriverManager的getConnection源码中获取conn为什么是遍历注册的driver的低效的方式呢?

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);
}

我估计是历史原因????????

阅读 430
评论 2018-09-26 提问
    1 个回答
    _TNT_
    • 3.1k

    目测是的,至少 hikari 的实现,那连接不是这么拿的

    评论 赞赏 2018-09-26