3. Driver 源码

java.sql.Driver接口规定了Driver应该具有以下功能,重要的有三个acceptsURL判断jdbcUrl是否支持、创建一个连接、获取属性信息,三个主要接口。

下边以 NonRegisteringDriver​ 类的源码简单分析以下。

acceptsURL

acceptsURL(String url) 方法用来测试对指定的url,该驱动能否打开这个url连接。driver对自己能够连接的url会制定自己的协议,只有符合自己的协议形式的url才认为自己能够打开这个url,如果能够打开,返回true,反之,返回false;

Mysql-JDBC支持的驱动协议有:

  • jdbc:mysql+srv:
  • jdbc:mysql+srv:loadbalance:
  • jdbc:mysql+srv:replication:
  • mysqlx+srv:
  • jdbc:mysql:
  • jdbc:mysql:loadbalance:
  • jdbc:mysql:replication:
  • mysqlx:
connect

这里会根据URL 创建一个连接。一般是ConnectionImpl类型,下一篇文章会细说一下。其他类型的连接就先不看了。

java 复制代码
public java.sql.Connection connect(String url, Properties info) throws SQLException {

    try {
        // 如果url是不自持的连接协议,则返回null
        if (!ConnectionUrl.acceptsUrl(url)) {
            return null;
        }

        ConnectionUrl conStr = ConnectionUrl.getConnectionUrlInstance(url, info);
        switch (conStr.getType()) {
            case SINGLE_CONNECTION:
                return com.mysql.cj.jdbc.ConnectionImpl.getInstance(conStr.getMainHost());

            case FAILOVER_CONNECTION:
            case FAILOVER_DNS_SRV_CONNECTION:
                return FailoverConnectionProxy.createProxyInstance(conStr);

            case LOADBALANCE_CONNECTION:
            case LOADBALANCE_DNS_SRV_CONNECTION:
                return LoadBalancedConnectionProxy.createProxyInstance(conStr);

            case REPLICATION_CONNECTION:
            case REPLICATION_DNS_SRV_CONNECTION:
                return ReplicationConnectionProxy.createProxyInstance(conStr);

            default:
                return null;
        }

    } catch (UnsupportedConnectionStringException e) {
        // when Connector/J can't handle this connection string the Driver must return null
        return null;

    } catch (CJException ex) {
        throw ExceptionFactory.createException(UnableToConnectException.class,
                Messages.getString("NonRegisteringDriver.17", new Object[] { ex.toString() }), ex);
    }
}

SINGLE_CONNECTION 会创建一个 ConnectionImpl

java 复制代码
    public static JdbcConnection getInstance(HostInfo hostInfo) throws SQLException {
        return new ConnectionImpl(hostInfo);
    }
getPropertyInfo

获取这些属性信息 HOST、PORT、DBNAME、USER、PASSWORD

java 复制代码
@Override
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
    String host = "";
    String port = "";
    String database = "";
    String user = "";
    String password = "";

    if (!isNullOrEmpty(url)) {
        ConnectionUrl connStr = ConnectionUrl.getConnectionUrlInstance(url, info);
        if (connStr.getType() == Type.SINGLE_CONNECTION) {
            HostInfo hostInfo = connStr.getMainHost();
            info = hostInfo.exposeAsProperties();
        }
    }

    if (info != null) {
        host = info.getProperty(PropertyKey.HOST.getKeyName());
        port = info.getProperty(PropertyKey.PORT.getKeyName());
        database = info.getProperty(PropertyKey.DBNAME.getKeyName());
        user = info.getProperty(PropertyKey.USER.getKeyName());
        password = info.getProperty(PropertyKey.PASSWORD.getKeyName());
    }

    DriverPropertyInfo hostProp = new DriverPropertyInfo(PropertyKey.HOST.getKeyName(), host);
    hostProp.required = true;
    hostProp.description = Messages.getString("NonRegisteringDriver.3");

    DriverPropertyInfo portProp = new DriverPropertyInfo(PropertyKey.PORT.getKeyName(), port);
    portProp.required = false;
    portProp.description = Messages.getString("NonRegisteringDriver.7");

    DriverPropertyInfo dbProp = new DriverPropertyInfo(PropertyKey.DBNAME.getKeyName(), database);
    dbProp.required = false;
    dbProp.description = Messages.getString("NonRegisteringDriver.10");

    DriverPropertyInfo userProp = new DriverPropertyInfo(PropertyKey.USER.getKeyName(), user);
    userProp.required = true;
    userProp.description = Messages.getString("NonRegisteringDriver.13");

    DriverPropertyInfo passwordProp = new DriverPropertyInfo(PropertyKey.PASSWORD.getKeyName(), password);
    passwordProp.required = true;
    passwordProp.description = Messages.getString("NonRegisteringDriver.16");

    JdbcPropertySet propSet = new JdbcPropertySetImpl();
    propSet.initializeProperties(info);
    List<DriverPropertyInfo> driverPropInfo = propSet.exposeAsDriverPropertyInfo();

    DriverPropertyInfo[] dpi = new DriverPropertyInfo[5 + driverPropInfo.size()];
    dpi[0] = hostProp;
    dpi[1] = portProp;
    dpi[2] = dbProp;
    dpi[3] = userProp;
    dpi[4] = passwordProp;
    System.arraycopy(driverPropInfo.toArray(new DriverPropertyInfo[0]), 0, dpi, 5, driverPropInfo.size());

    return dpi;
}
相关推荐
福赖2 小时前
《MySQL基础——用户管理》
mysql·用户管理
不宕机的小马达5 小时前
【Mysql|第一篇】Mysql的安装与卸载、Navicat工具的使用
数据库·mysql
孔丘闻言5 小时前
python调用mysql
android·python·mysql
a_blue_ice8 小时前
JAVA 面试 MySQL
java·mysql·面试
Java水解11 小时前
【MySQL】数据库基础
后端·mysql
沃夫上校11 小时前
MySQL 中文拼音排序问题
java·mysql
要一起看日出11 小时前
MVCC-多版本并发控制
数据库·mysql·mvcc
Hx__11 小时前
MySQL InnoDB 的 MVCC 机制
数据库·mysql
chat2tomorrow13 小时前
数据采集平台的起源与演进:从ETL到数据复制
大数据·数据库·数据仓库·mysql·低代码·postgresql·etl
依稀i12313 小时前
Spring Boot + MySQL 创建超级管理员
spring boot·mysql