这段代码的关键是这一句代码:
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); }
推荐阅读
- 面试|面试:你只有6根烟,突然来7位领导怎么办?第5个回答说到位了
- 网络常见面试题
- 安卓面试题到处攒,一到面试就忘个干净?来看看这份超详细的整理
- 面试必问的 Redis:RDB、AOF、混合持久化
- 吐血整理!这200道阿里P6必备Java面试题,我简直太爱了
- 面试官经常问AOP,那到底啥是AOP?
- 面试官:知道 springboot 的启动原理吗?
- 面试不懂 Linux 内存管理?我用 20 张图给你讲明白
- 洗牌 面试遇到shuffle算法时,用这三种就够了
- 招聘|如何面试管理人员
