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

DS注解作用

@DS(“#header.dbTenantId”) 是 MyBatis-Plus 框架中的注解,用于指定数据源。其中 #header.dbTenantId 表示从请求头中获取 dbTenantId 参数的值,作为数据源的标识。
@DS(“#tenantId”)中的 #tenantId 表示从方法参数中获取 tenantId 参数的值,作为数据源的标识。
@DS(“master”) 中的 “master” 表示数据源的标识,即指定使用名为 master 的数据源。
在多租户系统中,不同的租户可能需要连接不同的数据库,因此需要动态切换数据源。使用 @DS 注解可以方便地实现动态切换数据源的功能。通过在注解中指定数据源的标识,可以让 MyBatis-Plus 框架自动切换到对应的数据源,从而实现动态切换数据源的功能。
需要注意的是,使用 @DS 注解需要在 Spring Boot 配置文件中配置多个数据源,并在注解中指定数据源的标识。同时,也需要在代码中使用 @Mapper 注解标注 Mapper 接口,以便 MyBatis-Plus 框架能够自动扫描并生成对应的 Mapper 实现类。

样例:

spring:datasource:tenant1:url: jdbc:mysql://localhost:3306/tenant1_db?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Drivertenant2:url: jdbc:mysql://localhost:3306/tenant2_db?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver

在上面的配置文件中,定义了两个数据源,分别为 tenant1 和 tenant2。其中,tenant1 数据源连接的是 tenant1_db 数据库,tenant2 数据源连接的是 tenant2_db 数据库。
在代码中,可以使用 @DS 注解动态指定使用哪个租户的数据源。例如:

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@DS("#tenantId")@Overridepublic List<User> listUsers(Long tenantId) {return userMapper.selectList(null);}
}

失效情况:
updateUser方法的数据源会覆盖掉getUserById方法的数据源
可以将getUserById方法放到另一个类中,使之代理注解生效

@Service
public class UserServiceImpl implements UserService {@Autowired@Qualifier("dataSource1")private DataSource dataSource1;@Autowired@Qualifier("dataSource2")private DataSource dataSource2;@Override@DS("dataSource1")@Transactional(value = "transactionManager1")public User getUserById(int id) {// 使用dataSource1查询用户信息// ...}@Override@Transactional(value = "transactionManager2")@DS("dataSource2")public void updateUser(User user) {// 在这里调用getUserById方法,应该使用dataSource1数据源User oldUser = getUserById(user.getId());// 使用dataSource2更新用户信息// ...}
}

原因:

@DS注解是通过AOP实现的,它会在方法执行前切换数据源。而@Transactional注解也是通过AOP实现的,它会在方法执行前开启事务,并在方法执行后提交或回滚事务。
当一个方法同时被@DS和@Transactional注解修饰时,Spring会先创建一个代理对象,这个代理对象会同时包含@DS和@Transactional的功能。当代理对象调用这个方法时,它会先切换数据源,然后开启事务。在事务执行期间,如果这个方法调用了另一个方法,那么这个方法也会被代理对象所代理,也就是说,这个方法也会被切换到当前数据源,并且也会被包含在当前事务中。
如果在调用另一个方法时,这个方法上也有@DS注解,那么这个注解会被代理对象所覆盖,也就是说,这个方法会使用当前数据源,而不是它本来应该使用的数据源。这就是为什么@DS注解会被覆盖的原因。

相关文章:

  • http状态,cookie、session、token的对比
  • COMSOL传热建模
  • etcd java 客户端jetcd库踩坑日志
  • 【HDFS】Decommision(退役) EC数据节点剩最后几个块卡住的问题
  • 超低功耗32位单片机MM32L0130
  • 【Android】隐藏settings中的二级菜单
  • 【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?
  • 【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)
  • 计算机网络(2)-----数据链路层
  • 集合篇之ArrayList
  • 【软件测试】--功能测试4-html介绍
  • untiy 室内灯光最佳实践
  • 爬取博客的图片并且将它存储到响应的目录
  • C#高级:DataGridView的详解
  • 练习2-线性回归迭代(李沐函数简要解析)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • github从入门到放弃(1)
  • JavaScript设计模式与开发实践系列之策略模式
  • Laravel5.4 Queues队列学习
  • Making An Indicator With Pure CSS
  • node-glob通配符
  • ucore操作系统实验笔记 - 重新理解中断
  • 大快搜索数据爬虫技术实例安装教学篇
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 好的网址,关于.net 4.0 ,vs 2010
  • 如何解决微信端直接跳WAP端
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 设计模式走一遍---观察者模式
  • 使用 Docker 部署 Spring Boot项目
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 学习笔记TF060:图像语音结合,看图说话
  • 用mpvue开发微信小程序
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​香农与信息论三大定律
  • #每日一题合集#牛客JZ23-JZ33
  • $$$$GB2312-80区位编码表$$$$
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (力扣题库)跳跃游戏II(c++)
  • (七)Java对象在Hibernate持久化层的状态
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)scrum常见工具列表
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .aanva
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @Transactional 详解
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限