JDBC之如何连接数据库源码剖析

JDBC之如何连接数据库源码剖析

  1. 文字性的描述都在里面,那么我还是抄下来吧!本来是给自己看的,但是越看越有意思,于是就把图补充了一下,下面我把那一段话尽量分成小段来总结一下哈!!!

  2. 一张图带你看完JDBC怎么链接到数据库的,JDBC连接到数据库通过两种方式我只分析了一种DriverManager,但是另一种通过接口Datasource来连接,我把API的话粘下来大家自己品尝一下好了.

  3. 该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。实现 DataSource 接口的对象通常在基于 JavaTM Naming and Directory Interface (JNDI) API 的命名服务中注册。

    • 基本实现 - 生成标准的 Connection 对象
    • 连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
    • 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。
  4. 可以看到两种连接看起来存在很大的差别,但是只不过在注册生成方面存在一些差异,使用的还是同一套的connectionImp.

  5. 下面进入正文

    1. 通过DriverManager在CopyOnWriterArrayList类中进行注册,保存相应的信息,加载类完毕后
    2. 当我们需要获取连接时,使用DriverManager中的getConnection方法,通常我们传递相应的三个参数url,username,还有password.但是无论用那种的getConnection到最后都会进入到最后那个getConnection即图中显示的那个
    3. 在这个方法中我们可以看到前面许多的if判断语句,那么我们需要在代码中看到重点代码,即for(DriverInfo aDriver : registeredDrivers),这便是我们在加载类注册的全部信息,有几个就会循环几次.这时你已经看到路终点的代码,那么精华来了
    4. 即Connection con = aDriver.driver.connect(url,info);这时候你就要向前看那个接口driver到底是哪个真正的类实现了该接口,通过分析我们可以发现这个driver就是开头中的JDBC的driver类,即new Driver()即实现,那么调用它的connect方法,但是我们发现并没有该方法
    5. 这时候你需要看类中的父类NonRegisteringDriver有没有该方法,进入到该类返现有该方法,那么进入到该类中的connect方法去探究该源码的实现,重点的代码我已经标出,即new出了一个ConnectionImp类并传递了相应的参数,啊真的是讨厌又要翻ConnectionImp的构造函数了不要担心你已经进入到真正的新世界了
    6. 高潮部分来了,在构造函数中我们发现了大量的描述性信息,什么urlrootuser啥的都妥妥的,此时我们很难再往下去翻源码了,因为太多而且找不到重点的代码,别慌我们发现了try看描述性信息弄完之后的代码,即NonRegisteringDriver.trackConnection(this);
    7. 诶这段代码是干嘛的,描述性信息都结束了,看该构造,看他是那个类的,特别神奇的发现这就是我们刚刚分析过的类中的,然后ctrl+鼠标左键,进去,如图所示(实在是不想写了)我们会慢慢发现有MysqlIO,sockete什么的,这时候相信你心中已经有了答案,由此我们的源码分析也就完成了,是不是很兴奋呢!!!哈哈哈哈哈