3. Driver 源码

这篇具有很好参考价值的文章主要介绍了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类型,下一篇文章会细说一下。其他类型的连接就先不看了。

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

    public static JdbcConnection getInstance(HostInfo hostInfo) throws SQLException {
        return new ConnectionImpl(hostInfo);
    }
getPropertyInfo

获取这些属性信息 HOST、PORT、DBNAME、USER、PASSWORD文章来源地址https://www.toymoban.com/news/detail-812375.html

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

到了这里,关于3. Driver 源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

    java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 这个错误的意思是在程序运行的时候找不到类 com.mysql.cj.jdbc.Driver 。 这通常是因为在程序中使用了 MySQL 的 JDBC 驱动,但是没有将 MySQL 的 JDBC 驱动添加到类路径中。 要解决这个问题,需要在程序中添加 MySQL JDBC 驱动的 jar 包。具体的

    2024年02月05日
    浏览(76)
  • java.sql.SQLException: com.mysql.cj.jdbc.Driver

    这篇文章分享一下Springboot整合Elasticsearch时遇到的一个问题,项目正常启动,但是查询数据库的时候发生了一个异常java.sql.SQLException: com.mysql.cj.jdbc.Driver 通过断点发现加载数据库驱动的时候传进来的类加载器居然是null,惊呆了我的小伙伴,不知道看这篇文章的童鞋有没有遇到

    2024年02月10日
    浏览(61)
  • 处理JDBC:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/DB

    今天花费一个多小时的事件处理这个问题,最终的处理方法真的是太…棒了,我重开了个项目,建了下模块,结果问题解决了。 本着斩草要除根……咳咳,刨根问底的原则,我决定细查一下这个问题,下面是我得到的结果! 不说废话,简单来说:   官方定义了的一套操作

    2023年04月11日
    浏览(38)
  • DBeaver报错:can‘t load driver class ‘com.mysql.cj.jdbc.Driver‘

    如图: Can\\\'t create driver instance   Error creating driver \\\'MySQL\\\' instance. Most likely required jar files are missing. You should configure jars in driver settings. Reason: can\\\'t load driver class \\\'com.mysql.cj.jdbc.Driver\\\'   Error creating driver \\\'MySQL\\\' instance. Most likely required jar files are missing. You should configure jars in driver settin

    2024年02月15日
    浏览(87)
  • Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: com.mysql.jdbc.Driver

    记录idea报错, 1.引用外部库 mysql-connector-java-8.0.26 dependency       groupIdmysql/groupId       artifactIdmysql-connector-java/artifactId       version8.0.26/version /dependency   2. 引入最新版的c3p0 dependency     groupIdcom.mchange/groupId     artifactIdc3p0/artifactId     version0.9.5.5/version /dependency 3.连接的驱

    2024年02月02日
    浏览(47)
  • 解决java.sql.SQLException: com.mysql.cj.jdbc.Driver报错

    当有: com .alibaba.druid.support.logging.JakartaCommonsLoggingImpl error 严重: create connection error, url: ...... java.sql.SQLException: com.mysql.cj.jdbc.Driver....... 类似这两类的报错的时候经总结可能有如下几个问题: 1.首先检查你的jar/pom文件的mysql版本号: mysql5.x.x 的版本配置应为: \\\"com.mysql.jdbc.driver\\\"

    2023年04月26日
    浏览(65)
  • java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 异常解决

      目录 问题 原因 解决         今天在开发一个DB同步工具的时候,因为采用的是原生的jdbcDriver链接数据库的,代码如下“ Class.forName(this.jdbcDriver); ”,我这边的配置是“ \\\"jdbcDriver\\\":\\\"com.mysql.cj.jdbc.Driver\\\" ”,当程序走到这一行的时候就报错“ java.lang.ClassNotFoundException: com.mys

    2024年02月08日
    浏览(53)
  • 【IDEA】彻底解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    最开始出现这个问题,是我在写一个MVC的JAVA WEB 项目中遇到的,卡了将近两个小时。 先来复述一下我当时遇到的问题吧,我在DBHelper类中测试成功了可以连接上数据库。 运行结果:(显示链接正常了) ​ ​ 显示数据库链接正常,此时去IDEA的数据库页面测试IDEA与数据库的链

    2024年02月04日
    浏览(94)
  • driver-class-name: com.mysql.cj.jdbc.Driver代码爆红的解决问题

    在搭建运行springboot项目时,数据库驱动添加会报错。 而在此之前需要在pom.xml中添加mysql依赖,在多次寻求问题解决方法的过程中,我发现一个关键的说辞,就是: 我在mysql依赖中添加了版本号,而这个问题的出现很可能就是版本号不一致,导致了本次标红的主题: 那么到了

    2024年02月06日
    浏览(63)
  • java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver解决方案

    此报错会出现在两种情况,有各自的解决方法。 如果在Java程序中报错 ,那么我们就参考 方法1 (单Java程序),错误演示: 如果你是在Tomcat中报错 ,那么我们可以参考 方法2 (Tomcat项目),错误演示:   错误原因:其实就是程序没有安装JDBC驱动,对于Java程序来说我们只需

    2024年02月08日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包