美文网首页
JDBC 的 getConnection连接源码解析

JDBC 的 getConnection连接源码解析

作者: kacen | 来源:发表于2022-06-14 20:57 被阅读0次

    本篇对jdbc的获取连接进行解析
    1.这里是直接上代码哈,它的getConnection会通过相对应调用的重载方法来进行不同的操作,我们主要看我们常规的连接方式。

     @CallerSensitive
        public static Connection getConnection(String url,
            String user, String password) throws SQLException {
            //存放相关配置属性
            java.util.Properties info = new java.util.Properties();
            if (user != null) {
                info.put("user", user);
            }
            if (password != null) {
                info.put("password", password);
            }
            //会继续调用本类getConnection方法,并传入反射的getCallerClass方法。
            return (getConnection(url, info, Reflection.getCallerClass()));
        }
    

    继续之前需要解释一下@CallerSensitive
    @CallerSensitive开发者正常调用是不起作用的,因为java并不希望我们调用该方法。(它也是可以被调用的, -Xbootclasspath/a: path 在jvm启动进行配置)它必须有启动类ClassLoader加载(比如rt.jar才能被识别)。
    Reflection.getCallerClass()这个方法就必须加上@CallerSensitive配合使用。
    它这里是做什么用的??
    2.然后我们继续往下看(看注解哦)

    //  Worker method called by the public getConnection() methods.
        private static Connection getConnection(
            String url, java.util.Properties info, Class<?> caller) throws SQLException {
            /*
             * When callerCl is null, we should check the application's
             * (which is invoking this class indirectly)
             * classloader, so that the JDBC driver class outside rt.jar
             * can be loaded from here.
             */
            //这里的话就基本大概知道为什么了,它在这里的话就会通过它来获取的我们的数据库连接的驱动。
            ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
            synchronized(DriverManager.class) {
                // synchronize loading of the correct classloader.
                if (callerCL == null) {
                    callerCL = Thread.currentThread().getContextClassLoader();
                }
            }
    
            if(url == null) {
                throw new SQLException("The url cannot be null", "08001");
            }
    
            println("DriverManager.getConnection(\"" + url + "\")");
    
            // Walk through the loaded registeredDrivers attempting to make a connection.
            // Remember the first exception that gets raised so we can reraise it.
            SQLException reason = null;
            //这里的话就会获取完后并通过配置进行连接,最后返回Connection。
            for(DriverInfo aDriver : registeredDrivers) {
                // If the caller does not have permission to load the driver then
                // skip it.
                if(isDriverAllowed(aDriver.driver, callerCL)) {
                    try {
                        println("    trying " + aDriver.driver.getClass().getName());
                        Connection con = aDriver.driver.connect(url, info);
                        if (con != null) {
                            // Success!
                            println("getConnection returning " + aDriver.driver.getClass().getName());
                            return (con);
                        }
                    } catch (SQLException ex) {
                        if (reason == null) {
                            reason = ex;
                        }
                    }
    
                } else {
                    println("    skipping: " + aDriver.getClass().getName());
                }
    
            }
            //如果走到这里就是百分百有问题啦,就是报错的原因会在这抛出。
            // if we got here nobody could connect.
            if (reason != null)    {
                println("getConnection failed: " + reason);
                throw reason;
            }
            //走到这里的话就是找不到合适的驱动
            println("getConnection: no suitable driver found for "+ url);
            throw new SQLException("No suitable driver found for "+ url, "08001");
        }
    
    

    相关文章

      网友评论

          本文标题:JDBC 的 getConnection连接源码解析

          本文链接:https://www.haomeiwen.com/subject/tmzzmrtx.html