1. 项目概述
dynamic-datasource 是一个轻量级的 Java 多数据源管理框架,它能够帮助开发者轻松实现项目中多数据源的动态切换和管理。在实际企业级应用开发中,我们经常需要同时连接多个数据库,可能是不同的业务数据库、读写分离的主从库,或者是分库分表后的多个数据节点。传统的手动管理方式不仅代码冗余,而且容易出错。dynamic-datasource 通过简洁的 API 和注解驱动的方式,让多数据源管理变得简单高效。
我在多个分布式系统中使用过这个框架,它最吸引我的特点是几乎零侵入的集成方式和灵活的动态切换能力。无论是传统的 Spring 项目还是 Spring Boot 应用,都能快速接入。框架内部实现了数据源的路由逻辑,开发者只需要关注业务代码,无需操心连接池的管理细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心设计解析
2.1 架构设计原理
dynamic-datasource 采用了分层设计的思想,核心架构包含以下几个关键组件:
- 数据源容器:维护所有注册的数据源实例,采用 Map 结构存储,Key 为数据源名称
- 路由决策器:根据当前线程上下文决定使用哪个数据源
- 注解解析器:处理 @DS 注解,将其转换为路由指令
- 连接代理:对原生 Connection 进行包装,加入切换和清理逻辑
框架通过 ThreadLocal 保存当前线程的数据源选择,这种设计确保了在多线程环境下也能正确路由。当方法调用进入时,框架会根据注解或编程式指定的数据源名称,从容器中获取对应的数据源实例。
2.2 关键特性实现
2.2.1 动态切换机制
动态切换的核心在于 AbstractRoutingDataSource 的扩展实现。框架重写了 determineCurrentLookupKey 方法,使其能够从以下三个位置按优先级获取数据源名称:
- 方法上的 @DS 注解
- 类上的 @DS 注解
- 通过 DynamicDataSourceContextHolder 手动设置的值
这种多层次的查找策略既保证了灵活性,又提供了合理的默认值机制。在实际使用中,90% 的场景只需要使用注解即可满足需求。
2.2.2 事务管理集成
与 Spring 事务的集成是框架的另一大亮
