关于线程上下文类加载器已经在之前学得比较透了,作为一个收尾,这里用平常J2EE开发时JDBC连接Mysql数据库常见的一段代码通过分析它的底层进一步加深对线程上下文类加载器的理解,所以先来将连接应用代码写上,注意:这里不力求真正的去完成数据的连接,重在在分代码,如下:

说实话如今的工作重点是搞android的开发,再来看上面的这段代码还是非常之亲切的,当然啦搞J2EE开发的那就不用多说了,家常便饭了,好,接下来先来分析第一行代码:

对于mysql驱动有两个:

而我们使用的是第一个,对于forName方法目前我们也比较清楚它的作用了,看一下它的源码:

既然会初始化"com.mysql.jdbc.Driver",那就跟到这个类里面,看在初始化的时候干了啥:

对于类的初始化是位置类加载的第三个阶段,这里再来回忆一下其整个过程:

而类的初始化会导至类的static代码【静太代码块,静态变量】得到执行,所以:

所以此时会调用DriverManager.registerDriver()方法,但是在调用方法之前肯定也得初始化DriverManager嘛,所以跟进去:

是不是如咱们分析的这样的呢,咱们可以debug看一下,先打上断点:

嗯~~完全正确!继续分析:

跟进去:

这是加载JDBC的另外一种方式,咱们可以打印一下该系统属性:

接着往下执行:

所以最终会用这种方式去加载驱动,所以这个方法就是去执行了驱动的加载工作,流程再回到上一层:

注册驱动里面是如何做的呢?

接着回到主流程的第二句代码:

细心的话可以发现,这句话完全木有Mysql的API居然最后就可以生成Mysql的一个连接,这底层是怎么做到的呢?继续跟踪,先简单看一下getConnection的javadoc:

接着看它的具体代码实现:

这里可以打一个段点看一下第三个参数是否如所料:

嗯~~完成正确~~继续往下分析:

继续打断点确认一下是否如预料:

咱们debug看一下此时registeredDrivers的值是多少:

呃~~为啥有两个呢,咱们第一句代码不只是指定了一个么,如下:

这是因为如今的mysql版本会自动在这个目录进行寻找并注册驱动:

所以这里需要注意,继续往下:

好,这个细节非常重要,定位到它看一下:

想想为啥呢?命名空间!!!!可能这块已经都忘得差不多了,因为不同的类加载器所加载的相同的类是不相等的,如之前【https://www.cnblogs.com/webor2006/p/9157847.html】我们做实验所示:

回到咱们这个场景,由于是SPI的场景,用户可以随意去设置线程上下文类加载器,所以就有可能出现不等的情况,这也是为啥要做一个判断的原因之所在,继续往下分析:

至此整个JDBC的创建连接的过程就已经分析完了,而类加载器这块的所有知识都已经学完啦,相当之不易,想当初对于类的双亲委托机制只知道概念,每次面试官问到这个时也仅能回到出理论部分,经过这么细致的学习我想不管未来的面试还是工作当中遇到类加载相关的问题应该是so easy的事啦!

通过JDBC驱动加载深刻理解线程上下文类加载器机制的更多相关文章

  1. 线程上下文类加载器(Context ClassLoader)

    1.线程上下文类加载器是从jdk1.2开始引入的,类Thread中的getContextClassLoader()与setContextClassLoader(ClassLoader c1),分别用来 ...

  2. jvm(1)类的加载(三)(线程上下文加载器)

    简介: 类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的. Java Applet 需要从远程下载 Java 类文件到浏览器中并执行. 现在类加载器在 ...

  3. jvm(1)类的加载(二)(自定义类加载器)

    [深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...

  4. 7. 通过JDBC源码来分析线程上下文类加载器以及SPI的使用

    目录 1. 什么是全盘负责委托机制 2. 为什么需要有线程上下文类加载器 2.1 使用JDBC的例子,分析为什么双亲委托机制不能实现要求 2.2 线程上下文类加载器的作用 3. 线程上下文类加载器的使 ...

  5. 深入理解Java类加载器(二):线程上下文类加载器

    摘要: 博文<深入理解Java类加载器(一):Java类加载原理解析>提到的类加载器的双亲委派模型并不是一个强制性的约束模型,而是Java设计者推荐给开发者的类加载器的实现方式.在Java ...

  6. 【JVM学习笔记】线程上下文类加载器

    有许多地方能够看到线程上下文类加载的设置,比如在sun.misc.Launcher类的构造方法中,能够看到如下代码 先写一个例子建立感性认识 public class Test { public st ...

  7. 【Java虚拟机11】线程上下文类加载器

    前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载 ...

  8. JVM 线程上下文类加载器

    当前类加载器(Current ClassLoader) 每个类都会使用自己的类加载器(即加载自身的类加载器)来去加载其他类(指所依赖的类) 如果ClassX引用了ClassY,那么ClassX的类加载 ...

  9. 线程上下文类加载器ContextClassLoader内存泄漏隐患

    前提 今天(2020-01-18)在编写Netty相关代码的时候,从Netty源码中的ThreadDeathWatcher和GlobalEventExecutor追溯到两个和线程上下文类加载器Cont ...

随机推荐

  1. Linux上安装Julia-1.1

    Julia 在Linux上的安装 浙江大学Julia镜像: 浙江大学Julia镜像 下载1.1版本: wget https://mirrors.zju.edu.cn/julia/releases/v1 ...

  2. 获取淘宝客推广位id(adzone_id)

    在 获取淘宝联盟选品库的宝贝信息 这个接口中需要用到 推广位id,那边这个ID在哪找呢?1.进入阿里妈妈后台>推广管理>推广位管理,如下图: 2.在推广位管理 列表页 找到 PID,最后一 ...

  3. 洛谷 题解 P4955 【[USACO14JAN]Cross Country Skiing 越野滑雪】

    二分+DFS 看到这么多大佬写了并查集,BFS的,还没有人写DFS版的,那么肯定是要来水水积分的啦毕竟这可是道伪紫题呢! 做法楼上楼下也讲得很清楚了吧,详见代码的注释 #include<bits ...

  4. SQL SERVER YEAR函数

    定义: YEAR函数返回指定日期的年的部分 语法: YEAR(date) 参数: ①date参数是合法的日期表达式. 返回值: int型数据 例:  声明:本文是本人查阅网上及书籍等各种资料,再加上自 ...

  5. Reactor 线程模型以及在netty中的应用

    这里我们需要理解的一点是Reactor线程模型是基于同步非阻塞IO实现的.对于异步非阻塞IO的实现是Proactor模型. 一 Reactor 单线程模型 Reactor单线程模型就是指所有的IO操作 ...

  6. 洛谷P4779 【模板】单源最短路径

    P4779 [模板]单源最短路径(标准版) 题目链接 https://www.luogu.org/problemnew/show/P4779 题目描述 给定一个 N个点,M条有向边的带非负权图,请你计 ...

  7. 异常处理 try

    语法错误 这种错误的不能使用异常处理,你自己粗心写错怪谁,哼哼哼 比如说少冒号啦,丢了括号啦 逻辑错误 try: num = int(input("请输入数字")) print(1 ...

  8. 基于bootstrap selectpicker ,实现select下拉框模糊查询功能

    1.html代码块 需要引入bootstrap的css js jquery bootstrap.css bootstrap-select.min.css jquery-1.11.3.min.js bo ...

  9. 怎样通过CSS选择器获取元素节点或元素节点集合

    使用 document.querySelector() 和 document.querySelectorAll(), 将 CSS选择器 作为参数传入即可. // 标签选择器 document.quer ...

  10. 4-MySQL DBA笔记-开发进阶

    第4章 开发进阶 本章将介绍一些重中之重的数据库开发知识.在数据库表设计中,范式设计是非常重要的基础理论,因此本章把它放在最前面进行讲解,而这其中又会涉及另一个重要的概念——反范式设计.接下来会讲述M ...