springboot dynamic配置多数据源

pom.xml引入jar包

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>

application配置文件配置如下

需要主要必须配置primary即主数据源,datasource后面可以自定义 不同数据源之间区分名字即可

### 实现动态配置多数据源的最佳实践 #### 配置 `application.yml` 文件支持多数据源Spring Boot 应用程序中,通过修改 `application.yml` 或者 `application.properties` 来定义多个数据源。对于 YAML 格式的配置文件来说,可以如下设置: ```yaml spring: datasource: master: # 主库配置 url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave: # 从库配置 url: jdbc:mysql://localhost:3307/slave_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` 此部分展示了如何为应用程序中的不同数据库实例提供必要的连接参数[^1]。 #### 使用 `DynamicDataSource` 类管理数据源 创建自定义的 `DynamicDataSource` 组件用于管理和切换当前使用的数据源。该类继承自默认的数据源抽象类并重写了相应的方法以便于灵活控制实际执行查询操作的目标数据库。 ```java import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceType(); } } ``` 这段代码实现了核心逻辑——根据上下文环境决定应该访问哪一个具体的物理数据源。 #### 定义切面拦截器自动选择合适的数据源 为了让开发者无需手动指定每次调用时所依赖的具体数据源名称,在业务层面上引入 AOP 技术来自动生成相应的环绕通知(Aspect),从而简化开发流程的同时也提高了系统的可维护性和扩展能力。 ```java @Aspect @Component @Slf4j public class DataSourceAspect { private static final String DS_KEY = "dataSource"; @Around("@annotation(com.example.annotation.DataSource)") public Object around(ProceedingJoinPoint point) throws Throwable { String dsName = getDsName(point); try { log.info("Switch to data source : {}", dsName); DataSourceContextHolder.setDataSourceType(dsName); return point.proceed(); } finally { clearDsName(); } } private void clearDsName(){ DataSourceContextHolder.clearDataSourceType(); } private String getDsName(ProceedingJoinPoint joinPoint){ MethodSignature signature = (MethodSignature)joinPoint.getSignature(); Method method = signature.getMethod(); if(method.isAnnotationPresent(DataSource.class)){ DataSource dataSource = method.getAnnotation(DataSource.class); return dataSource.value().name(); } throw new RuntimeException("No Data Source Found"); } } ``` 上述 Java 代码片段展示了一个典型的面向切面编程(AOP)模式的应用场景,其中包含了对方法级别的注解解析以及事务边界内的资源清理工作[^2]。 #### 引入第三方库简化配置过程 考虑到项目初期搭建成本和技术栈兼容性的考量,推荐采用成熟的开源组件来加速开发进度。例如 `dynamic-datasource-spring-boot-starter` 就是一个不错的选择,其内置了许多实用特性使得整个集成变得更加简单快捷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值