The driver is automatically registered via the SPI -这是啥含义?

jdbc.Driver 被自动注册了?这里面牵扯到几件事,一一道来;

1. 何为SPI,它是如何把Driver加载进去的;

SPI ,全名:Service Provider Interface. ,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。

带着疑问,我们打开mysql-connect-java包,看到了上面描述的配置文件:

那它是如何做到的呢?为啥加载到这儿了,我们带着代码来看看~

在DriverManager 类里面有个loadInitialDrivers,里面有个load ,如下图:

ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);

我们点进去瞅瞅,从ServiceLoader 发现了端倪:

调用栈如下,在加载 HikariDataSource 对象时候调用到:

 

2. 这边用到了SPI,它和双亲委派什么关系?

SPI 会打破双亲委派机制。

类加载的范围受到限制,某些情况下父class loader无法加载某些类文件,这时候就需要委托到下层级的class loader去加载类文件。 [1]

JDBC的driver接口定义在JDK中,但是它的实现类是放在classpath下的(比如MySQL)。

  • DriverManager类会加载每个Driver接口的实现类并管理它们,但是DriverManager类自身是 jre/lib/rt.jar 里的类,是由bootstrap classloader加载的
  • 根据类加载机制,某个类需要引用其它类的时候,虚拟机将会用这个类的classloader去加载被引用的类
  • boostrap classloader显然是无法加载到MySQL driver的(ClassNotFoundException)
  • 因此只能在DriverManager里强行指定下层classloader来加载Driver实现类,而这就会打破双亲委派模型

参考链接:https://juejin.cn/post/7007292903361871903

PS:还有一种打破双亲委派的方式,自定义loadClass, tomcat就是这么干的。

3. 我没有主动配置数据连接池,默认是啥,性能如何?

看了下日志,发现默认的数据库连接池是 HikariDataSource。

有点疑问的是,有些文章默认用的Druid连接池,那两者有啥差距呢?好奇搜了搜,结论如下:

所以还是乖乖地使用大家帮忙选的这个数据库连接池吧~~~

(20条消息) 02、连接池hiKariCP和druid的使用以及良心对比_不要停止思考-jcn的博客-CSDN博客_druid hikaricp

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值