DriverManager原理

DriverManager原理 (个人理解小记,有错误的地方还请指正)

DriverManager的静态代码块会有以下操作

1,扫描所有jar包中含有 META-INF/services/java.sql.Driver

2,然后获取其中的驱动名称,并加载对应驱动,基本上实现了java.sql.Driver接口的实现类都有一个静态代码块,里面调用了DriverManager.registerDrive(),因为类加载器加载类时会调用静态代码块,所以类加载器加载驱动时就会调用对应的静态代码块,从而注册到DriverManager的已注册驱动列表 registeredDrivers

如果引入了oracle驱动jar包,又引入了mysql驱动jar包,那按照上面的步骤,最后registeredDrivers里会有2条记录。

 

当获取数据库连接时,DriverManger.getConnection()会遍历registeredDrivers,并且还要根据传入的url测试是否可以连接(oracle和mysql两种驱动的url有不同的前缀,"jdbc:mysql:"和"jdbc:oracle:") ,

isDriverAllowed() 方法用于确保,注册的驱动类对调用类是可见的,因为 注册驱动的类 和 当前调用驱动的类 的 类加载器可以能并非同一个,导致不能互相调用

 

结论

也就是说jdk1.6后虽然可以不用class.forName手动加载驱动,但必须确保 当前调用的类加载器和加载驱动的类加载器是同一个,所以最好在获取连接前调用Class.forName("com.mysql.cj.jdbc.Driver")来确保 加载器是同一个

posted @   来自China的神秘人  阅读(668)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示