当前位置: 首页 > article >正文

多数据源配置及使用,在同一个方法下切换数据源。

切换数据源方法:

1. 通过注解切换数据源,可以在方法上使用也可以在类上使用,遵循就近原则

@DS(“数据源名”)

注意:在同一个方法使用多个数据源不要使用@Transactional,会导致报错。

2. 方法中手动切换

切换数据源类似压栈,弹栈操作。引入依赖和配置文件见示例。

//引入jar包
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;

@Override
public OperaResponse testSelectCompanyAndUser() {
    //方法体内部
    //切换数据源
    DynamicDataSourceContextHolder.push("mysql1");
    //数据操作

    //释放数据源
    DynamicDataSourceContextHolder.poll();

    //切换数据源
    DynamicDataSourceContextHolder.push("mysql2");
    //数据操作

    //释放数据源
    DynamicDataSourceContextHolder.poll();
    return OperaResponse.ok();
}

示例使用场景,使用方法1

将测试服务器的企业与用户的关联关系映射到本地服务器中。

本例在mapper类上使用@DS切换数据源

引入依赖

<properties>        
    <dynamic-datasource.version>3.5.0</dynamic-datasource.version>
</properties>

<!-- Mybatis-plus多数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>${dynamic-datasource.version}</version>
</dependency>

配置文件yml

datasource:
    dynamic:
      primary: mysql1 #设置默认的数据源或者数据源组,默认值即为mysql1
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        mysql1: # 数据源名
          driverClassName: com.mysql.cj.jdbc.Driver
          url: 数据源地址?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
          username: 用户名
          password: 密码
        mysql2: # 数据源名
          driverClassName: com.mysql.cj.jdbc.Driver
          url: 数据源地址?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
          username: 用户名
          password: 密码
    # 以下非必须,配置数据库连接池
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      connection-timeout: 30000       # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
      minimum-idle: 5                 # 最小连接数
      maximum-pool-size: 20           # 最大连接数
      auto-commit: true               # 自动提交
      idle-timeout: 600000            # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
      pool-name: DateSourceHikariCP     # 连接池名字
      max-lifetime: 1800000           # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
      connection-test-query: SELECT 1

Mapper.java

@Repository
@DS("mysql2")
public interface CompanyUserMapper extends BaseMapper<CompanyUser> {
}

UserService.java

public interface IUserService extends IService<User> {
    /**
     * 将测试服务器的企业与用户的关联关系映射到本地服务器中
     *
     * 多数据源中@Transactional(rollbackFor = Exception.class) 事务失效并会导致切换数据源报错
     * @DS("mysql1"),@DS("mysql1")切换数据源可以在方法上使用,也可以在类上使用。
     *     如在mapper类或方法上使用,或在serviceImpl类或方法上使用。
     * @return
     */
    OperaResponse CompanyAndUserMapping();
}

UserServiceImpl.java

@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Autowired
    private CompanyUserMapper companyUserMapper;

    @Override
    public OperaResponse CompanyAndUserMapping() {
        //查询所有企业部门用户信息
        List<CompanyUser> companyUserList = companyUserMapper.selectList(new QueryWrapper<>());
        //将企业部门用户信息根据用户id进行分组
        Map<Long, List<CompanyUser>> map = companyUserList.stream().collect(Collectors.groupingBy(CompanyUser::getUserId));

        List<User> userList = this.list();
        //将企业id映射到用户表中
        for(User user : userList){
            if(map.containsKey(user.getId())){
                List<CompanyUser> companyUserList1 = map.get(user.getId());
                if(CollectionUtils.isEmpty(companyUserList1)){
                    return OperaResponse.error(ErrStatus.ERR_COMPANY);
                }
                if(companyUserList1.size() > 1){
                    log.info("用户id为:" + user.getId() + "的用户存在多个企业。"+"企业信息为:"+ companyUserList1.toString());
                }
                user.setCompanyId(companyUserList1.get(0) == null ? null : companyUserList1.get(0).getCompanyId());
                //更新用户信息
                this.updateById(user);
            }
        }
        return OperaResponse.ok();
    }
}

UserController.java

@RestController
@RequestMapping("/management/user")
public class UserController {

    @Autowired
    private IUserService userService;
 
   /**
     * 将测试服务器的企业与用户的关联关系映射到本地服务器中
     *
     * 多数据源中@Transactional(rollbackFor = Exception.class) 事务失效并会导致切换数据源报错
     * @DS("mysql1"),@DS("mysql1")切换数据源可以在方法上使用,也可以在类上使用。
     *     如在mapper类或方法上使用,或在serviceImpl类或方法上使用。
     * @return
     */
    @GetMapping("/CompanyAndUserMapping")
    @WebLog(description = "映射企业与用户关系")
    public OperaResponse CompanyAndUserMapping(){
        return userService.CompanyAndUserMapping();
    }
}


http://www.kler.cn/a/537095.html

相关文章:

  • ESP32开发学习记录---》GPIO
  • 力扣.270. 最接近的二叉搜索树值(中序遍历思想)
  • 《深度揭秘LDA:开启人工智能降维与分类优化的大门》
  • 【大数据技术】搭建完全分布式高可用大数据集群(Scala+Spark)
  • unity学习32:角色相关1,基础移动控制
  • VUE 集成企微机器人通知
  • 基于JUnit4和JUnit5配合例子讲解JUnit的两种运行方式
  • 笔记本电脑屏幕泛白问题解决详解(AMD显卡)
  • .NET 8 WebAPI文件下载包含断点续传和取消下载
  • STM32 CUBE Can调试
  • (11)gdb 笔记(4):设置执行方向 set exec-direction,
  • OpenCV:图像修复
  • RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)
  • CSS 伪类(Pseudo-classes)的详细介绍
  • Java基础学习笔记-封装
  • Python在数据科学中的高效应用:从数据处理到模型部署的实战指南
  • 高效运维!K8s 多节点自动安全排空
  • 为多个GitHub账户配置SSH密钥
  • PostgreSQL 中的 EXTRACT 函数_操作日期
  • 服务器磁盘高占用排查
  • Qt 数据库SQLite 使用【01】基本功能
  • Lua中文语言编程源码-第十一节,其它小改动汉化过程
  • Android studio 创建aar包给Unity使用
  • 使用 Axios ——个人信息修改
  • ES6 Set 数据结构用法总结
  • Flutter List 的 every 如果回调函数抛出异常 应该如何处理