iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource怎么用
  • 907
分享到

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

2023-06-30 14:06:31 907人浏览 泡泡鱼
摘要

本篇内容介绍了“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怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: ​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource怎么用

本文链接: https://www.lsjlt.com/news/329444.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • ​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource怎么用
    本篇内容介绍了“Spring多租户数据源管理AbstractRoutingDataSource怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2023-06-30
  • ​​​​​​​Spring多租户数据源管理AbstractRoutingDataSource
    目录1.基本原理2.配置代码3.问题总结前言: 很多情况,我们确实需要在一个服务中访问多个数据源。虽然它让整体设计变的不那么优雅,但真实的世界确实需要它。比如,你的业务为两个比较大的...
    99+
    2024-04-02
  • 浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题
    在互联网的服务端开发的时候,我们很经常要在一个项目中去调用不同的数据库。在这种情况下,必然要涉及到多数据源问题。那么,我们该如何解决多数据源问题呢?有没有一种方法来动态切换数据源呢?答案是有的。万能的Spring已经给了我们解决方案——利用...
    99+
    2023-05-31
    spring abstractroutingdatasource dat
  • Teradata如何支持多租户环境下的数据隔离和资源管理
    Teradata支持多租户环境下的数据隔离和资源管理通过以下方式: 数据隔离:Teradata提供了基于角色的访问控制(RBAC...
    99+
    2024-04-09
    Teradata
  • Spring Boot怎么整合多数据源
    本篇内容主要讲解“Spring Boot怎么整合多数据源”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot怎么整合多数据源”吧!前言:什么是多数据源最常见的...
    99+
    2023-06-30
  • 使用Linux 怎么实现文档多租户管理
    使用Linux 怎么实现文档多租户管理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。创建账户相关信息groupadd microsoft ; 新增群组useradd -G ...
    99+
    2023-06-10
  • Spring Boot多数据源及其事务管理配置方法
    准备工作先给我们的项目添加Spring-JDBC依赖和需要访问数据库的驱动依赖。配置文件spring.datasource.prod.driverClassName=com.mysql.jdbc.Driverspring.datasourc...
    99+
    2023-05-31
    spring boot 多数据源
  • 数据库用户管理怎么实现
    这篇文章主要讲解了“数据库用户管理怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库用户管理怎么实现”吧!1、用户定义  用户定义:  mysql...
    99+
    2024-04-02
  • 多数据源怎么利用spring boot进行配置
    本篇文章给大家分享的是有关多数据源怎么利用spring boot进行配置,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。多数据源配置创建一个Spring配置类,定义两个DataS...
    99+
    2023-05-31
    springboot 多数据源
  • 数据库用户资源管理涉及到的数据包有哪些
    本篇内容介绍了“数据库用户资源管理涉及到的数据包有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!用户资...
    99+
    2024-04-02
  • Spring多数据源AOP动态切换怎么实现
    这篇文章主要讲解了“Spring多数据源AOP动态切换怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring多数据源AOP动态切换怎么实现”吧!一:新增多数据源类public c...
    99+
    2023-06-04
  • springboot-jta-atomikos多数据源事务管理实现
    目录背景源码地址项目目录结构 实现1.添加依赖 pom.xml2.配置数据库连接信息 application.properties3.创建多数据源 DBAtomikosCo...
    99+
    2024-04-02
  • Hibernate中怎么使用容器管理的数据源
    本篇内容介绍了“Hibernate中怎么使用容器管理的数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.使用容器管理的数据源在包含JN...
    99+
    2023-06-17
  • Oracle 12c多租户常用管理命令有哪些
    这篇文章给大家分享的是有关Oracle 12c多租户常用管理命令有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。--进入cdb  sqlplus /nolog &n...
    99+
    2024-04-02
  • Spring Boot多数据源处理事务实例分析
    这篇“Spring Boot多数据源处理事务实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring&n...
    99+
    2023-06-30
  • Spring Boot 多数据源处理事务的思路详解
    目录1. 思路梳理2. 代码实践2.1 案例准备2.2 开始整活LoadDataSource.java3. 总结首先我先声明一点,本文单纯就是技术探讨,要从实际应用中来说的话,我并不...
    99+
    2024-04-02
  • Beekeeper Studio开源数据库管理工具怎么使用
    本篇内容主要讲解“Beekeeper Studio开源数据库管理工具怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Beekeeper Studio开源数据库管理工具怎...
    99+
    2023-07-02
  • MySQL数据库用户权限管理
    目录1、用户管理1.1、创建用户1.2、删除用户1.3、修改用户密码2、权限管理2.1、授予权限 grant2.2、取消权限 revoke2.3、刷新权限 flush3、密码丢失的解...
    99+
    2024-04-02
  • spring怎么配置两个数据源
    在Spring中配置两个数据源需要进行以下步骤:1. 添加两个数据源的配置文件(比如datasource1.properties和d...
    99+
    2023-10-18
    spring
  • 使用Spring如何实现配置多个数据源
    使用Spring如何实现配置多个数据源?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。配置两个不同的数据源,如下(由于项目使用的是druid数据库连接,配置可以会复杂点比较):&...
    99+
    2023-05-31
    spring 数据源
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作