面试被问:JDBC底层是如何连接数据库的?( 三 )

这段代码的关键是这一句代码:
Connection con = aDriver.driver.connect(url, info);connet()方法是每个数据库驱动自己的实现的 。
package com.mysql.cj.jdbc;public class NonRegisteringDriver implements java.sql.Driver {     @Override    public java.sql.Connection connect(String url, Properties info) throws SQLException {         //部分无关键要的代码省略        //下面是重点        ConnectionUrl conStr = ConnectionUrl.getConnectionUrlInstance(url, info);        switch (conStr.getType()) {                //SINGLE_CONNECTION("jdbc:mysql:", HostsCardinality.SINGLE), //                case SINGLE_CONNECTION:                    return com.mysql.cj.jdbc.ConnectionImpl.getInstance(conStr.getMainHost());                case LOADBALANCE_CONNECTION:                    return LoadBalancedConnectionProxy.createProxyInstance((LoadbalanceConnectionUrl) conStr);                case FAILOVER_CONNECTION:                    return FailoverConnectionProxy.createProxyInstance(conStr);                case REPLICATION_CONNECTION:                    return ReplicationConnectionProxy.createProxyInstance((ReplicationConnectionUrl) conStr);                default:                    return null;        }     }}    ConnectionUrl从这个类名应该能猜到还不到真正连接的,只是创建一个连接Url相关信息封装 。
public abstract class ConnectionUrl implements DatabaseUrlContainer {    private static final String DEFAULT_HOST = "localhost";    private static final int DEFAULT_PORT = 3306;    //...}    熟悉的身影,MySQL数据库默认端口 。我们继续看下一行重要的代码:
ConnectionImpl.getInstance(conStr.getMainHost());
这里就是获取一个实例,不出意外,连接就在这里面产生的 。继续:
//ConnectionImplpublic static JdbcConnection getInstance(HostInfo hostInfo) throws SQLException {     return new ConnectionImpl(hostInfo);}ConnectionImpl构造方法里有调用createNewIO方法:
    @Override    public void createNewIO(boolean isForReconnect) {        synchronized (getConnectionMutex()) {              try {                if (!this.autoReconnect.getValue()) {                    connectOneTryOnly(isForReconnect);                    return;                }                connectWithRetries(isForReconnect);            } catch (SQLException ex) {             }        }    }private void connectOneTryOnly(boolean isForReconnect) throws SQLException {        Exception connectionNotEstablishedBecause = null;             JdbcConnection c = getProxy();            //又看到熟悉的connet方法,            this.session.connect(this.origHostInfo, this.user, this.password, this.database, DriverManager.getLoginTimeout() * 1000, c);             this.session.setQueryInterceptors(this.queryInterceptors);      }


推荐阅读