• Mybatis Plus配置多个数据源


    介绍

     MP集成多数据源的官方文档:多数据源 | MyBatis-Plus

    特性

    • 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)
    • 提供 基于seata的分布式事务方案

    约定

    • 本框架只做切换数据源这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD
    • 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换
    • @DS注解支持ServiceImpl,暂不支持Service接口上的@DS注解

    导入依赖

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>druid-spring-boot-starterartifactId>
    4. <version>1.2.11version>
    5. dependency>
    6. <dependency>
    7. <groupId>mysqlgroupId>
    8. <artifactId>mysql-connector-javaartifactId>
    9. <version>8.0.21version>
    10. dependency>
    11. <dependency>
    12. <groupId>com.baomidougroupId>
    13. <artifactId>mybatis-plus-boot-starterartifactId>
    14. <version>3.3.1version>
    15. dependency>
    16. <dependency>
    17. <groupId>com.baomidougroupId>
    18. <artifactId>dynamic-datasource-spring-boot-starterartifactId>
    19. <version>3.3.1version>
    20. dependency>

    配置文件

    配置一主一从

    1. spring:
    2. datasource:
    3. dynamic:
    4. primary: master #设置默认的数据源或者数据源组, 默认值即为master
    5. strict: false #严格匹配数据源,默认false,true未匹配到指定数据源时抛异常,false使用默认数据源
    6. datasource:
    7. # 主数据源
    8. master:
    9. url: jdbc:mysql://localhost:3306/table1?serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true
    10. username: root
    11. password: "password"
    12. type: com.alibaba.druid.pool.DruidDataSource
    13. driver-class-name: com.mysql.cj.jdbc.Driver
    14. # 从数据源
    15. slave_1:
    16. url: jdbc:mysql://localhost:3306/table2?serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true
    17. username: root
    18. password: "password"
    19. type: com.alibaba.druid.pool.DruidDataSource
    20. driver-class-name: com.mysql.cj.jdbc.Driver

    其他配置模式

    1. # 多主多从 纯粹多库(记得设置primary) 混合配置
    2. spring: spring: spring:
    3. datasource: datasource: datasource:
    4. dynamic: dynamic: dynamic:
    5. datasource: datasource: datasource:
    6. master_1: mysql: master:
    7. master_2: oracle: slave_1:
    8. slave_1: sqlserver: slave_2:
    9. slave_2: postgresql: oracle_1:
    10. slave_3: h2: oracle_2:

    @DS注解

    ServiceImpl类/ServiceImpl类的方法上加@DS注解

    • 注解加到ServiceImpl类上 --> 类里的方法都使用此数据源

    • 注解加到ServiceImpl的方法上 --> 使用方法上的注解的数据源(方法上的注解 优先于 类上注解)

    1. @Service
    2. @DS("slave_1")
    3. public class UserServiceImpl extends ServiceImpl implements UserService {
    4. @Resource
    5. private UserMapper userMapper;
    6. @Override
    7. @DS("master")
    8. public List getUser() {
    9. return userMapper.selectList(null);
    10. }
    11. }

    不加@DS注解,使用默认数据源,默认值master数据源

    注意事项

    启动主类需要排除Druid相关依赖

    @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) 

    否则会出现如下错误

    1. ***************************
    2. APPLICATION FAILED TO START
    3. ***************************
    4. Description:
    5. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
    6. Reason: Failed to determine a suitable driver class

    事务中使用@DS注解

    1. @Service("serviceA")
    2. public class ServiceImpl implements Service{
    3. @Override
    4. @DS("database1")
    5. public void functionA() {
    6. functionB(); //调用B方法且切换为B方法的所需要的数据源
    7. }
    8. @Override
    9. @DS("database2")
    10. public void function B() {}
    11. }

    A方法调用B方法时,B方法的@DS注解不生效,会使用A方法配置的数据源,B方法的@DS("database2")将完全被A方法的@DS("database1")所覆盖。

    解决: 在事务内是无法使用@DS进行切换数据源,在ServiceImpl的方法上使用下面注解,在执行此方法时,挂起外部事务,创建一个新的内部事务。

     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
  • 相关阅读:
    HamsterBear 构建可启动的镜像(更新中)
    基于Springboot+Vue的网上蛋糕销售系统(含源码数据库)
    Ubuntu宝塔显示磁盘被占满的解决方法
    C#编程模式之桥接模式(Bridge)
    计算机毕设(附源码)JAVA-SSM计算机组成原理教学系统
    城市级数字孪生底座平台具有新内涵
    RibbitMQ学习笔记之MQ练习
    《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力
    简历撰写——Java与.NET(当年毕业生版本)
    官宣!2024影响因子即将公布,或将迎来这些重大变化!
  • 原文地址:https://blog.csdn.net/m0_56750901/article/details/126498614