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属性为驱动的全类名。

  • 相关阅读:
    保险行业电话外呼型呼叫中心方案
    12355青少年服务台呼叫中心解决方案
    未能找到类型集或命名空间名称 "xxxxxx" (是否缺少using 指令或引用?)
    Smarty中section的使用
    什么是Asterisk,它如何帮助我们的呼叫中心?
    高效呼叫中心的8个健康工作习惯
    Python 爬起数据时 'gbk' codec can't encode character 'xa0' 的问题
    Python 网页解析器
    Python 爬虫入门3种方法
    Python open 读写小栗子
  • 原文地址:https://www.cnblogs.com/silenceshining/p/15640563.html
Copyright © 2011-2022 走看看