• 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)
  • 相关阅读:
    图神经网络关系抽取论文阅读笔记(二)
    perl use HTTP::Server::Simple 轻量级 http server
    基于Quartz的可视化UI操作组件GZY.Quartz.MUI更新说明(附:在ABP中集成GZY.Quartz.MUI可视化操作组件)
    【C语言趣味教程】(5) 常量:字面常量 | 类型常量 | const 关键字 | const 的声明 | 程序中的只读概念 | const 保护机制 | 如何巧妙区分 “指针常量“ 和 “常量指针“
    SpringData高级应用之SpringData JPA全面使用(增删改查操作完整代码)
    Go语言并发赋值的安全性
    【Node.JS】事件的绑定与触发
    Unity团结引擎使用总结
    安装Homebrew安装Git(Mac)
    编译链接(Compile Link)
  • 原文地址:https://blog.csdn.net/m0_56750901/article/details/126498614