java实现多租户_spring boot 项目中多租户的实现

本文介绍了在Spring Boot项目中实现多租户功能的方法,通过AbstractRoutingDataSource进行数据源动态切换。每个租户对应一个独立的数据库,通过AOP拦截器根据请求头中的租户标识动态设置数据源。
摘要由CSDN通过智能技术生成

项目背景

项目中SaaS服务需要提供多租户基础功能,通过访问域名区分不同的客户,进而隔离数据源,即一个租户一个数据库。

AbstractRoutingDataSource

spring中对切换数据源提供了动态设置方法,通过determineCurrentLookupKey()设置值切换对应数据源。

org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 源码的介绍:

af82a23f44c5

基于AbstractRoutingDataSource的多数据源动态切换,可以实现读写分离,但是注意无法动态的增加数据源,只能在项目启动时加载。

实现逻辑

定义DynamicDataSource类继承抽象类AbstractRoutingDataSource,并实现了determineCurrentLookupKey()方法。

启动时加载多个数据源,并配置到AbstractRoutingDataSource的defaultTargetDataSource和targetDataSources中。

对所有controller方法做aop,根据当前域名或者前端设置值修改本地线程动态数据源名称。

新建类 DynamicDataSource

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**

* 动态获取DataSource

*

* @author plsy

*/

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return DynamicDataSourceContextHolder.getDataSource();

}

}

通过基于本地线程的上下文管理来切换数据源

import org.apache.log4j.Logger;

import java.util.LinkedList;

/**

* 动态数据源上下文管理

*

* @author plsy

*/

public class DynamicDataSourceContextHolder {

static Logger logger = Logger.getLogger(DynamicDataSourceContextHolder.class);

/**

* 存放当前线程使用的数据源类型信息

*/

private static final ThreadLocal contextHolder = new ThreadLocal();

/**

* 数据源使用顺序标识

*/

public static LinkedList dataSourceIds =

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值