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;
}
相关推荐
郑州光合科技余经理1 小时前
同城系统海外版:一站式多语种O2O系统源码
java·开发语言·git·mysql·uni-app·go·phpstorm
爱吃面条的猿5 小时前
MySQL 随机日期/时间生成
数据库·mysql
2501_939909055 小时前
Mysql 主从复制、读写分离
数据库·mysql
k***82515 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
wstcl5 小时前
通过EF Core将Sql server数据表移植到MySql
数据库·mysql·sql server·efcore
故渊ZY5 小时前
从入门到精通:MySQL 核心技术与业务落地实践
mysql
计算机毕设匠心工作室5 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
qq_12498707536 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计
Dxy12393102169 小时前
MySQL连表更新
数据库·mysql
对 酒 当 歌 人 生 几 何9 小时前
Mysql多表连接
数据库·sql·mysql