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

ops/2025/2/8 8:24:21/

切换数据源方法:

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 #设置默认的数据源或者数据源组,默认值即为mysql1strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:mysql1: # 数据源名driverClassName: com.mysql.cj.jdbc.Driverurl: 数据源地址?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=trueusername: 用户名password: 密码mysql2: # 数据源名driverClassName: com.mysql.cj.jdbc.Driverurl: 数据源地址?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=trueusername: 用户名password: 密码# 以下非必须,配置数据库连接池type: com.zaxxer.hikari.HikariDataSourcehikari: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分钟 1800000msconnection-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 {@Autowiredprivate CompanyUserMapper companyUserMapper;@Overridepublic 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 {@Autowiredprivate 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.ppmy.cn/ops/156681.html

相关文章

python编程-集合内置函数和filter(),集合常见操作

在Python中&#xff0c;列表、集合、字典是三种常用的数据结构&#xff0c;它们各自拥有一些内置函数&#xff0c;用于执行各种操作。 一、列表的常用内置函数 #‌1、append(obj)‌: 在列表末尾添加新的对象。list_a [1, 2, 3] list_a.append(4) print(list_a) # 输出: [1,…

群晖NAS如何通过WebDAV和内网穿透实现Joplin笔记远程同步

文章目录 前言1. 检查群晖Webdav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar工具4. 创建Webdav公网地址5. Joplin连接WebDav6. 固定Webdav公网地址7. 公网环境连接测试 前言 在数字化浪潮的推动下&#xff0c;笔记应用已成为我们记录生活、整理思绪的重要工具。Joplin&…

Boost:通过boost::process::child完成带管道的调用

管道是经常使用的,比如: $ cat file.txt this is data 1 this is date 1 this is data 2 this is date 2$ cat file.txt | grep data this is data 1 this is data 2那么通过C++怎么实现这种管道调用呢,实际上boost有提供方法: #include <boost/process.hpp> #inc…

【GitHub】相关工具下载及使用

目录 背景GitHub的使用Git工具下载及安装 背景 需要在GitHub查阅相关资料&#xff0c;以下是对使用GitHub做相关记录。 GitHub的使用 参考链接: GitHub入门指南&#xff1a;一步一步教你使用GitHub Git工具下载及安装 参考链接: windows安装git&#xff08;全网最详细&…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter5-基本引用类型

五、基本引用类型 引用值&#xff08;或者对象&#xff09;是某个特定引用类型的实例。 在 ECMAScript 中&#xff0c;引用类型是把数据和功能组织到一起的结构&#xff0c;经常被人错误地称作“类”。虽然从技术上讲 JavaScript 是一门面向对象语言&#xff0c;但 ECMAScript …

Golang 并发机制-7:sync.Once实战应用指南

Go的并发模型是其突出的特性之一&#xff0c;但强大的功能也带来了巨大的责任。sync.Once是由Go的sync包提供的同步原语。它的目的是确保一段代码只执行一次&#xff0c;而不管有多少协程试图执行它。这听起来可能很简单&#xff0c;但它改变了并发环境中管理一次性操作的规则。…

按月拆分工作表,报表清晰没烦恼-Excel易用宝

老板视角看数据&#xff0c;独爱每月一张表。 好好的一个流水数据表&#xff0c;我们老板又要让我把这个表格按月份拆分成12个工作表&#xff0c;还好让我拆分成12个工作表&#xff0c;要是让我拆分成每天一个表&#xff0c;那不是得累死我了吗&#xff1f; 听说一簿12表是职…

UE5 蓝图学习计划 - Day 14:搭建基础游戏场景

在上一节中&#xff0c;我们 确定了游戏类型&#xff0c;并完成了 项目搭建、角色蓝图的基础设置&#xff08;移动&#xff09;。今天&#xff0c;我们将进一步完善 游戏场景&#xff0c;搭建 地形、墙壁、机关、触发器 等基础元素&#xff0c;并添加角色跳跃功能&#xff0c;为…