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

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

阅读 2.3k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题