我的编程空间,编程开发者的网络收藏夹
学习永远不晚

​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource怎么用

本篇内容介绍了“Spring多租户数据源管理AbstractRoutingDataSource怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.基本原理

多数据源能进行动态切换的核心就是spring底层提供了AbstractRoutingDataSource类进行数据源路由。AbstractRoutingDataSource实现了DataSource接口,所以我们可以将其直接注入到DataSource的属性上。

我们主要继承这个类,实现里面的方法determineCurrentLookupKey(),而此方法只需要返回一个数据库的名称即可。

比如,Controller通过拿到前端业务传递的数值,进行业务逻辑分发。它就可以手动设置当前请求的数据库标识,然后路由到正确的库表里面。

@Controllerpublic class ARDTestController {    @GetMapping("test")    public void chifeng(){        //db-a 应该是上层传递下来的属性,我们可以把它放在ThreadLocal里        DataSourceContextHolder.setDbKey("db-a");    }}

那么当sql语句执行的时候,它如何知道自己需要切换到哪个数据源呢?是不是需要把db-a这个属性一直透传下去呢?

在Java中,可以使用ThreadLocal绑定这个透传的属性。像Spring的嵌套事务等实现的原理,也是基于ThreadLocal去运行的。所以,DataSourceContextHolder.本质上是一个操作ThreadLocal的类。

public class DataSourceContextHolder {    private static InheritableThreadLocal<String> dbKey = new InheritableThreadLocal<>();    public static void setDbKey(String key){        dbKey.set(key);    }    public static String getDbKey(){        return dbKey.get();    }}

2.配置代码

首先,我们自定义了配置文件的格式。如下面的代码,就配置了db-a和db-b两个数据库。

multi:  dbs:    db-a:      driver-class-name: org.h3.Driver      url: jdbc:h3:mem:dba;MODE=MYSQL;DATABASE_TO_UPPER=false;    db-b:      driver-class-name: org.h3.Driver      url: jdbc:h3:mem:dbb;MODE=MYSQL;DATABASE_TO_UPPER=false;

然后,我们将它解析称properties。

@ConfigurationProperties(prefix = "multi")@Configurationpublic class DbsProperties {    private Map<String, Map<String, String>> dbs = new HashMap<>();    public Map<String, Map<String, String>> getDbs() {        return dbs;    }    public void setDbs(Map<String, Map<String, String>> dbs) {        this.dbs = dbs;    }}

接下来一步,需要配置整个应用所默认的数据源。如你所见,它的主要逻辑,就是在运行的时候,从ThreadLocal里取出提前设置的这个值。

public class DynamicDataSource extends AbstractRoutingDataSource {    @Override    protected Object determineCurrentLookupKey() {        return DataSourceContextHolder.getDbKey();    }}

最后一步,设置整个项目中默认的DataSource。注意,我们生成DynamicDataSource之后,还需要提供targetDataSource和defaultTargetDataSource两个属性的值,才能够正常运行。

@Configurationpublic class DynamicDataSourceConfiguration {    @Autowired    DbsProperties properties;    @Bean    public DataSource dataSource(){        DynamicDataSource dataSource = new DynamicDataSource();        final Map<Object,Object> targetDataSource  = getTargetDataSource();        dataSource.setTargetDataSources(targetDataSource);        //TODO 默认数据库需要设置        dataSource.setDefaultTargetDataSource(targetDataSource.values().iterator().next());        return dataSource;    }    private Map<Object,Object> getTargetDataSource(){        Map<Object,Object> dataSources = new HashMap<>();        this.properties.getDbs().entrySet().stream()                .forEach(e->{                    DriverManagerDataSource dmd = new DriverManagerDataSource();                    dmd.setUrl(e.getValue().get("url"));                    dmd.setDriverClassName(e.getValue().get("driver-class-name"));                    dataSources.put(e.getKey(),dmd);                });        return  dataSources;    }}

3.问题

通过以上简单的代码,就可以实现Spring简单的多数据源管理。但明显的,它还存在很多问题。

  • 需要产品设计选择模式,进行业务切换。

  • 前端可以采用放在localStroage的方式,保存属性,可使用拦截器方式将变量每次都传递。

  • 后端每次请求,都需要带上目标db,可以采用放在ThreadLocal里的方式。但ThreadLocal有线程透传的问题,如果任务里开启了子线程,则变量不能共享。

  • 由于表是动态选择的,所以JPA自动创建和update等模式,将不可用。不方便测试和单元测试,在测试接口的时候,也需要每次强制指定指向的库。

  • 由于是修改数据源的模式,每次增加库,都需要重新启动上线才可以。如果要做到动态性,数据源销毁是个问题。

“Spring多租户数据源管理AbstractRoutingDataSource怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource怎么用

本篇内容介绍了“Spring多租户数据源管理AbstractRoutingDataSource怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
2023-06-30

浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题

在互联网的服务端开发的时候,我们很经常要在一个项目中去调用不同的数据库。在这种情况下,必然要涉及到多数据源问题。那么,我们该如何解决多数据源问题呢?有没有一种方法来动态切换数据源呢?答案是有的。万能的Spring已经给了我们解决方案——利用
2023-05-31

Spring Boot怎么整合多数据源

本篇内容主要讲解“Spring Boot怎么整合多数据源”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot怎么整合多数据源”吧!前言:什么是多数据源?最常见的单一应用中最多涉及
2023-06-30

Teradata如何支持多租户环境下的数据隔离和资源管理

Teradata支持多租户环境下的数据隔离和资源管理通过以下方式:数据隔离:Teradata提供了基于角色的访问控制(RBAC)和行级安全(RLS)等功能,可以确保不同租户之间的数据相互隔离。租户可以被分配不同的权限和访问级别,以确保各自的
Teradata如何支持多租户环境下的数据隔离和资源管理
2024-04-09

使用Linux 怎么实现文档多租户管理

使用Linux 怎么实现文档多租户管理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。创建账户相关信息groupadd microsoft ; 新增群组useradd -G
2023-06-10

Spring Boot多数据源及其事务管理配置方法

准备工作先给我们的项目添加Spring-JDBC依赖和需要访问数据库的驱动依赖。配置文件spring.datasource.prod.driverClassName=com.mysql.jdbc.Driverspring.datasourc
2023-05-31

多数据源怎么利用spring boot进行配置

本篇文章给大家分享的是有关多数据源怎么利用spring boot进行配置,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。多数据源配置创建一个Spring配置类,定义两个DataS
2023-05-31

Spring多数据源AOP动态切换怎么实现

这篇文章主要讲解了“Spring多数据源AOP动态切换怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring多数据源AOP动态切换怎么实现”吧!一:新增多数据源类public c
2023-06-04

Hibernate中怎么使用容器管理的数据源

本篇内容介绍了“Hibernate中怎么使用容器管理的数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.使用容器管理的数据源在包含JN
2023-06-17

Beekeeper Studio开源数据库管理工具怎么使用

本篇内容主要讲解“Beekeeper Studio开源数据库管理工具怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Beekeeper Studio开源数据库管理工具怎么使用”吧!Beek
2023-07-02

怎么使用SpringBoot配置多数据源

这篇文章主要介绍了怎么使用SpringBoot配置多数据源的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用SpringBoot配置多数据源文章都会有所收获,下面我们一起来看看吧。1. 引入jar包pom.
2023-06-29

多线云虚拟主机租用怎么管理

多线云虚拟主机租用管理可以按照以下步骤进行:1. 选择合适的虚拟主机:根据自己的需求和预算选择合适的虚拟主机,考虑到主机的性能、价格、带宽、存储空间等因素。2. 注册账号并购买虚拟主机:在云主机提供商的官方网站上注册账号,并选择需要的虚拟主
2023-08-26

win11怎么清理用户数据

要清理Win11上的用户数据,可以按照以下步骤进行操作:1. 打开"设置":点击任务栏上的"开始"按钮,然后点击"设置"图标(齿轮形状)。2. 进入"系统":在"设置"窗口中,点击"系统"选项。3. 选择"存储":在"系统"窗口中,点击左侧
2023-08-22

使用vue怎么实现身份认证管理和租户管理功能

本篇文章为大家展示了使用vue怎么实现身份认证管理和租户管理功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。按钮级权限src\utils\abp.js:export function checkP
2023-06-15

详解基于spring多数据源动态调用及其事务处理

需求:有些时候,我们需要连接多个数据库,但是,在方法调用前并不知道到底是调用哪个。即同时保持多个数据库的连接,在方法中根据传入的参数来确定。下图的单数据源的调用和多数据源动态调用的流程,可以看出在Dao层中需要有一个DataSource选择
2023-05-31

数据库管理客户端工具SQLPro Studio Mac怎么用

今天就跟大家聊聊有关数据库管理客户端工具SQLPro Studio Mac怎么用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。SQLPro Studio for Mac是macOS平
2023-06-05

动态数据源dynamic-datasource-spring-boot-starter怎么使用

这篇文章主要讲解了“动态数据源dynamic-datasource-spring-boot-starter怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“动态数据源dynamic-da
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录