jdbc 驱动加载

  在进行业务逻辑开发过程中,和数据库的交互基本都会使用数据库连接池(c3p0,druid等),上层再加上各种框架(hibernate或者mybatis等),对于底层几乎透明。如果让我们手动连接数据库也很简单一句话就可以解决Connection coon = DriverManager.getConnection(“url”,“username”,“password”),获取到coon就可以执行增删查改了。现在的问题是coon对象是怎么获取的?
  jdk本身只定义了数据库驱动的接口Driver,而具体实现并不在jdk包中,实现由各个数据库厂家来完成,像这种接口定义和实现分开的场景,运行时又是怎么关联的呢?这就是SPI的事了,SPI机制介绍。这篇博客写的还是不错的,唯一的遗憾就是并没有解释 “有关两个驱动都加载了,具体使用哪个驱动” 的问题。所以只好跟源码了,这里使用debug版本的jdk,product的看不了调试信息。关键地方在DriverManager中的getConnection()方法中,见下截图。
jdbc 驱动加载
  从图中可以看到已经注册了三个驱,而具体获取哪个Connection就在这个遍历逻辑处(这些驱动实现只需要把相关jar包引入到工程中就会被自动加载了)。逻辑很简单如果获取到的Connection不为空就直接返回了,比如我们的url类似“jdbc:mysql://192.168.104.83:3358”,在第一次遍历的时候就会返回mysql的Connection对象了,如果是postgresql的url 比如“jdbc:postgresql://127.0.0.1:5432”第一次遍历将返回null,得需要遍历到第三个才会返回不是null的Connection。