jdbc 驱动加载(SPI)

1 篇文章 0 订阅
1 篇文章 0 订阅

  在进行业务逻辑开发过程中,和数据库的交互基本都会使用数据库连接池(c3p0,druid等),上层再加上各种框架(hibernate或者mybatis等),对于底层几乎透明。如果让我们手动连接数据库也很简单一句话就可以解决Connection coon = DriverManager.getConnection(“url”,“username”,“password”),获取到coon就可以执行增删查改了。现在的问题是coon对象是怎么获取的?
  jdk本身只定义了数据库驱动的接口Driver,而具体实现并不在jdk包中,实现由各个数据库厂家来完成,像这种接口定义和实现分开的场景,运行时又是怎么关联的呢?这就是SPI的事了,SPI机制介绍。这篇博客写的还是不错的,唯一的遗憾就是并没有解释 “有关两个驱动都加载了,具体使用哪个驱动” 的问题。所以只好跟源码了,这里使用debug版本的jdk,product的看不了调试信息。关键地方在DriverManager中的getConnection()方法中,见下截图。
驱动选择
  从图中可以看到已经注册了三个驱动,而具体获取哪个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。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值