尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

12.jdbc第一步DriverManager

12.jdbc第一步DriverManager
📅 发布时间:2026/6/20 10:31:01

1.核心定位:JDBC 生态的 “驱动调度中枢”,用于管理数据库驱动实例。DriverManager 是 JDBC 核心工具类(java.sql.DriverManager)

2.是只能管理数据库的驱动实例吗?其他的驱动不能管吗?

  • 明确结论:DriverManager 只管理 “符合 JDBC 规范的数据库驱动实例”(即实现了 java.sql.Driver 接口的实例,如 MySQL 的 com.mysql.cj.jdbc.Driver 、 Oracle的oracle.jdbc.driver.OracleDriver),不管理其他任何 “非 JDBC 驱动实例”。
  • DriverManager 的设计目标是 “为 JDBC 数据库连接提供统一的驱动管理”,其管理范围有严格边界。

从底层源码来认识DriverManager

1.核心存储:驱动元信息集合(registeredDrivers)

// 存储驱动元信息的核心集合,线程安全的写时复制容器
private static final CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();

存储元素:不是直接存储 Driver 实例,而是 DriverInfo(DriverManager 内部静态私有类),封装了 Driver 实例、类加载器、注销状态、权限等元信息; DriverInfo具体代码如下:

// DriverManager 内部静态私有类
private static class DriverInfo {// 核心:封装的 JDBC 驱动实例(实现了 java.sql.Driver 接口)final Driver driver;// 加载该驱动的类加载器(关键:用于类加载器适配和可见性判断)final ClassLoader classLoader;// 驱动的注销状态标记(默认 false:未注销;true:已注销)volatile boolean deregistered;// 驱动的权限对象(用于安全管理器的权限校验)private final SQLPermission permission;// 构造方法:创建 DriverInfo 时必须传入 Driver 实例和类加载器DriverInfo(Driver driver, ClassLoader classLoader) {this.driver = driver;this.classLoader = classLoader;this.deregistered = false;// 创建权限对象(用于后续 deregisterDriver 等操作的权限校验)this.permission = new SQLPermission("deregisterDriver");}
}

2.向 DriverManager 中注册驱动,即将 DriverInfo 加入集合

// 驱动注册方法:registerDriver 是外部触发入口(驱动静态代码块自动调用)
public static void registerDriver(Driver driver) throws SQLException {if (driver == null) {throw new NullPointerException("驱动实例不能为 null");}// 1. 获取当前线程的类加载器(用于封装到 DriverInfo)ClassLoader classLoader = Thread.currentThread().getContextClassLoader();// 2. 创建 DriverInfo 实例(封装驱动+类加载器等元信息)DriverInfo driverInfo = new DriverInfo(driver, classLoader);// 3. 核心操作:将 DriverInfo 加入 registeredDrivers 集合registeredDrivers.add(driverInfo);// 可选:打印调试日志(若开启日志)println("已注册驱动元信息:" + driverInfo.driver.getClass().getName());
}

3.获取连接核心源码 getConnection(String url, Properties info),遍历驱动器,找到能处理当前链接的驱动器,然后返回由由驱动创建的 Connection 对象,供上层使用。

private static Connection getConnection(String url, Properties info) throws SQLException {if (url == null || url.isEmpty()) {throw new SQLException("URL cannot be null or empty");}// 遍历所有已注册的驱动for (DriverInfo di : registeredDrivers) {if (di.deregistered) continue; // 跳过已注销的驱动try {// 筛选支持当前 URL 的驱动if (di.driver.acceptsURL(url)) {println("Trying to connect with driver: " + di.driver.getClass().getName());// 调用驱动的 connect 方法获取连接Connection conn = di.driver.connect(url, info);if (conn != null) {println("Connection successful");return conn;}}} catch (SQLException e) {println("Driver " + di.driver.getClass().getName() + " failed: " + e.getMessage());// 不中断,继续尝试下一个驱动}}// 所有驱动都失败,抛出异常throw new SQLException("No suitable driver found for " + url);
}

下一节重点讲解 Connection 对象

相关新闻

  • 解决Spring Cloud Gateway中使用CompletableFuture.supplyAsync()执行Feign调用报错
  • anything
  • 从vw/vh到clamp(),前端响应式设计的痛点与进化 - 实践

最新新闻

  • 2026安徽省宣城市中考一两百分怎么办?口碑优选宠物护理专业最新发布 - cc江江
  • 赤峰市黄金回收去哪儿好?整理了5家靠谱实体店地址电话 - 马刺总冠军
  • 大连市今日黄金回收价格多少?本地5家口碑门店报价参考 - 嵩山路大王
  • 2026安徽省蚌埠市电大中专考证升大专必备中专学历最新发布 - cc江江
  • 赣州市黄金回收去哪儿好?整理了5家靠谱实体店地址电话 - 嵩山路大王
  • 2026 哈尔滨首饰回收哪家好 | 5 家正规门店盘点 奢二网高价上榜 - 讯息早知道

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号