zoukankan      html  css  js  c++  java
  • Druid 数据库连接池如何根据url加载Driver

    获取数据库连接首先从getConnection开始:

    DruidDataSource.class

     @Override
        public DruidPooledConnection getConnection() throws SQLException {
            return getConnection(maxWait);
        }

    第二步进入getConnection(maxWait)方法:

    DruidDataSource.class

    public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
            init();
    
            if (filters.size() > 0) {
                FilterChainImpl filterChain = new FilterChainImpl(this);
                return filterChain.dataSource_connect(this, maxWaitMillis);
            } else {
                return getConnectionDirect(maxWaitMillis);
            }
        }

    第三步进入init()方法:

    public void init() throws SQLException {
        
               ......
                if (this.driver == null) {
                    if (this.driverClass == null || this.driverClass.isEmpty()) {
                        this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl);
                    }
               ......
                   
        }

    第四步进入关键的JdbcUtils.getDriverClassName(this.jdbcUrl)方法:

    public static String getDriverClassName(String rawUrl) throws SQLException {
            if (rawUrl == null) {
                return null;
            }
            
            if (rawUrl.startsWith("jdbc:derby:")) {
                return "org.apache.derby.jdbc.EmbeddedDriver";
            } else if (rawUrl.startsWith("jdbc:mysql:")) {
                if (mysql_driver_version_6 == null) {
                    mysql_driver_version_6 = Utils.loadClass("com.mysql.cj.jdbc.Driver") != null;
                }
    
                if (mysql_driver_version_6) {
                    return MYSQL_DRIVER_6;
                } else {
                    return MYSQL_DRIVER;
                }
            } else if (rawUrl.startsWith("jdbc:log4jdbc:")) {
                return LOG4JDBC_DRIVER;
            } else if (rawUrl.startsWith("jdbc:mariadb:")) {
                return MARIADB_DRIVER;
            } else if (rawUrl.startsWith("jdbc:oracle:") //
                       || rawUrl.startsWith("JDBC:oracle:")) {
                return ORACLE_DRIVER;
            } else if (rawUrl.startsWith("jdbc:alibaba:oracle:")) {
                return ALI_ORACLE_DRIVER;
            } else if (rawUrl.startsWith("jdbc:microsoft:")) {
                return "com.microsoft.jdbc.sqlserver.SQLServerDriver";
            } else if (rawUrl.startsWith("jdbc:sqlserver:")) {
                return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
            } else if (rawUrl.startsWith("jdbc:sybase:Tds:")) {
                return "com.sybase.jdbc2.jdbc.SybDriver";
            } else if (rawUrl.startsWith("jdbc:jtds:")) {
                return "net.sourceforge.jtds.jdbc.Driver";
            } else if (rawUrl.startsWith("jdbc:fake:") || rawUrl.startsWith("jdbc:mock:")) {
                return "com.alibaba.druid.mock.MockDriver";
            } else if (rawUrl.startsWith("jdbc:postgresql:")) {
                return POSTGRESQL_DRIVER;
            } else if (rawUrl.startsWith("jdbc:edb:")) {
                return ENTERPRISEDB_DRIVER;
            } else if (rawUrl.startsWith("jdbc:odps:")) {
                return ODPS_DRIVER;
            } else if (rawUrl.startsWith("jdbc:hsqldb:")) {
                return "org.hsqldb.jdbcDriver";
            } else if (rawUrl.startsWith("jdbc:db2:")) {
                return DB2_DRIVER;
            } else if (rawUrl.startsWith("jdbc:sqlite:")) {
                return SQLITE_DRIVER;
            } else if (rawUrl.startsWith("jdbc:ingres:")) {
                return "com.ingres.jdbc.IngresDriver";
            } else if (rawUrl.startsWith("jdbc:h2:")) {
                return H2_DRIVER;
            } else if (rawUrl.startsWith("jdbc:mckoi:")) {
                return "com.mckoi.JDBCDriver";
            } else if (rawUrl.startsWith("jdbc:cloudscape:")) {
                return "COM.cloudscape.core.JDBCDriver";
            } else if (rawUrl.startsWith("jdbc:informix-sqli:")) {
                return "com.informix.jdbc.IfxDriver";
            } else if (rawUrl.startsWith("jdbc:timesten:")) {
                return "com.timesten.jdbc.TimesTenDriver";
            } else if (rawUrl.startsWith("jdbc:as400:")) {
                return "com.ibm.as400.access.AS400JDBCDriver";
            } else if (rawUrl.startsWith("jdbc:sapdb:")) {
                return "com.sap.dbtech.jdbc.DriverSapDB";
            } else if (rawUrl.startsWith("jdbc:JSQLConnect:")) {
                return "com.jnetdirect.jsql.JSQLDriver";
            } else if (rawUrl.startsWith("jdbc:JTurbo:")) {
                return "com.newatlanta.jturbo.driver.Driver";
            } else if (rawUrl.startsWith("jdbc:firebirdsql:")) {
                return "org.firebirdsql.jdbc.FBDriver";
            } else if (rawUrl.startsWith("jdbc:interbase:")) {
                return "interbase.interclient.Driver";
            } else if (rawUrl.startsWith("jdbc:pointbase:")) {
                return "com.pointbase.jdbc.jdbcUniversalDriver";
            } else if (rawUrl.startsWith("jdbc:edbc:")) {
                return "ca.edbc.jdbc.EdbcDriver";
            } else if (rawUrl.startsWith("jdbc:mimer:multi1:")) {
                return "com.mimer.jdbc.Driver";
            } else if (rawUrl.startsWith("jdbc:dm:")) {
                return JdbcConstants.DM_DRIVER;
            } else if (rawUrl.startsWith("jdbc:kingbase:")) {
                return JdbcConstants.KINGBASE_DRIVER;
            } else if (rawUrl.startsWith("jdbc:gbase:")) {
                return JdbcConstants.GBASE_DRIVER;
            } else if (rawUrl.startsWith("jdbc:xugu:")) {
                return JdbcConstants.XUGU_DRIVER;
            } else if (rawUrl.startsWith("jdbc:hive:")) {
                return JdbcConstants.HIVE_DRIVER;
            } else if (rawUrl.startsWith("jdbc:hive2:")) {
                return JdbcConstants.HIVE_DRIVER;
            } else if (rawUrl.startsWith("jdbc:phoenix:thin:")) {
                return "org.apache.phoenix.queryserver.client.Driver";
            } else if (rawUrl.startsWith("jdbc:phoenix://")) {
                return JdbcConstants.PHOENIX_DRIVER;
            } else if (rawUrl.startsWith("jdbc:kylin:")) {
                return JdbcConstants.KYLIN_DRIVER;
            } else if (rawUrl.startsWith("jdbc:elastic:")) {
                return JdbcConstants.ELASTIC_SEARCH_DRIVER;
            } else if (rawUrl.startsWith("jdbc:clickhouse:")) {
                return JdbcConstants.CLICKHOUSE_DRIVER;
            } else if(rawUrl.startsWith("jdbc:presto:")) {
                return JdbcConstants.PRESTO_DRIVER;
            }else {
                throw new SQLException("unkow jdbc driver : " + rawUrl);
            }
        }
    View Code

    可以看出是根据配置的url进行匹配获取Driver驱动的全类名,再通过反射的方式实例化Driver驱动。

    比如url: jdbc:mysql://localhost:3306就对应于下述代码:

    if (rawUrl.startsWith("jdbc:mysql:")) {
                if (mysql_driver_version_6 == null) {
                    mysql_driver_version_6 = Utils.loadClass("com.mysql.cj.jdbc.Driver") != null;
                }
    
                if (mysql_driver_version_6) {
                    return MYSQL_DRIVER_6;
                } else {
                    return MYSQL_DRIVER;
                }
            }

    最终对应于com.mysql.jdbc.Driver的全类名。

    另外:虽然代码中匹配了绝大多数jdbc连接的Driver驱动,但如果恰好用到一个未覆盖到的驱动,那就需要显式的配置driverClassName属性为驱动的全类名。

  • 相关阅读:
    转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)
    Branch and price and cut求解传统VRP问题以及VRPTW问题
    标号法(label-setting algorithm)求解带时间窗的最短路问题(ESPPRC)
    运筹学从何学起?如何快速入门精确式算法?
    转 | 模拟退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代码分享
    用Python画论文折线图、曲线图?几个代码模板轻松搞定!
    45. 截取“测试数据”后面的内容
    44. 更改oracle字符集编码american_america.zh16gbk 改为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    18. 浏览器关闭页面时弹出“确定要离开此面吗?”
    6. concat_ws用法
  • 原文地址:https://www.cnblogs.com/silenceshining/p/15640563.html
Copyright © 2011-2022 走看看