首页 > 数据库 >SAAS下一个mysql实例多个租户的库

SAAS下一个mysql实例多个租户的库

时间:2024-07-04 17:19:55浏览次数:20  
标签:tenantCode 租户 数据源 DynamicTenantDataSource SAAS dataSource mysql public

在多租户环境中,根据tenantCode字段动态切换数据库是常见的需求。这里将展示如何在Spring Boot和MyBatis项目中实现这一功能,具体步骤包括配置数据源、定义数据源路由逻辑以及在业务代码中使用。

1. 配置数据源

首先,你需要为你的应用配置一个主数据源,这个数据源将被用于连接到包含所有租户数据库的MySQL实例。然后,创建一个动态数据源,该数据源将根据tenantCode来决定使用哪个具体的数据库。

主数据源配置

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {

    @Bean(name = "primaryDataSource")
    public DataSource primaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306"); // 注意这里只提供实例URL,不指定数据库
        dataSource.setUsername("your_username");
        dataSource.setPassword("your_password");
        return dataSource;
    }

    @Bean
    public DynamicTenantDataSource dynamicTenantDataSource(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
        return new DynamicTenantDataSource(primaryDataSource);
    }
}

2. 定义动态数据源路由逻辑

接下来,你需要创建一个DynamicTenantDataSource类,它将继承AbstractRoutingDataSource并实现数据源的动态切换逻辑。此外,还需要一个TenantContext类来存储当前线程的tenantCode

public class DynamicTenantDataSource extends AbstractRoutingDataSource {

    private final Map<String, DataSource> tenantDataSources = new HashMap<>();

    public DynamicTenantDataSource(DataSource defaultDataSource) {
        super.setDefaultTargetDataSource(defaultDataSource);
    }

    public void addTenantDataSource(String tenantId, String databaseName) {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/" + databaseName);
        dataSource.setUsername("your_username");
        dataSource.setPassword("your_password");
        tenantDataSources.put(tenantId, dataSource);
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return TenantContext.getTenantCode();
    }

    public void removeTenantDataSource(String tenantId) {
        tenantDataSources.remove(tenantId);
    }
}

public class TenantContext {

    private static final ThreadLocal<String> tenantCodeHolder = new ThreadLocal<>();

    public static void setTenantCode(String tenantCode) {
        tenantCodeHolder.set(tenantCode);
    }

    public static String getTenantCode() {
        return tenantCodeHolder.get();
    }

    public static void clearTenantCode() {
        tenantCodeHolder.remove();
    }
}

3. 在业务代码中使用

现在,你可以在业务代码中根据tenantCode来切换数据源了。通常情况下,这会在服务层或过滤器中完成,以确保在处理请求之前设置正确的tenantCode,并在请求结束后清除它。

设置tenantCode

@Service
public class TenantService {

    @PostConstruct
    public void init() {
        ((DynamicTenantDataSource) dataSource()).addTenantDataSource("tenant1", "tenant_db_1");
        ((DynamicTenantDataSource) dataSource()).addTenantDataSource("tenant2", "tenant_db_2");
    }

    @Autowired
    private DataSource dataSource;

    public void processRequest(String tenantCode) {
        TenantContext.setTenantCode(tenantCode);
        try {
            // 执行数据库操作
        } finally {
            TenantContext.clearTenantCode();
        }
    }
}

注意事项

  • 确保在请求结束时清除tenantCode,避免影响后续请求。
  • 如果有多个线程同时访问,需要保证DynamicTenantDataSource的线程安全。
  • 在实际部署时,tenantCode和数据库名称的映射可能需要从配置文件或外部服务读取,而不是硬编码在代码中。

 

标签:tenantCode,租户,数据源,DynamicTenantDataSource,SAAS,dataSource,mysql,public
From: https://www.cnblogs.com/use-D/p/18284252

相关文章

  • Windows 安装DBeaver,并使用DBeaver进行数据库的操作(达梦数据库、MySQL数据库等)
    安装DBeaver可视化工具安装前准备准备环境JDK17DBeaver安装包达梦数据库驱动DBeaver代理包开始安装MySQL连接&操作MySQL连接操作达梦数据库连接&操作达梦数据库驱动DBeaver加载达梦数据库驱动达梦数据库连接操作免责声明安装前准备准备环境JDK17安装地址(官......
  • django models对应的mysql类型
    Django模型字段类型与MySQL数据库类型的对应关系如下:Django模型字段类型MySQL数据库类型AutoFieldBIGINTUNSIGNEDCharFieldVARCHARIntegerFieldINTDecimalFieldDECIMALDateFieldDATEDateTimeFieldDATETIMEFileField,ImageFieldVARCHAR(用于文件路径)BooleanFieldBOOL(如......
  • MySQL单表千万级数据查询优化大家怎么说(评论有亮点)
    题图来自APOD上次写了一篇MySQL优化实战的文章“MySQL千万级数据从190秒优化到1秒全过程”。这篇文章主要还是在实战MySQL优化,所以从造数据到查询SQL优化SQL都没有业务或者其它依赖,优化的技巧也不涉及软件架构就是纯SQL优化。由于笔者经验有限和篇幅限制没有展开讲很多细节,其......
  • 一文带你看懂什么是营销归因模型及SaaS企业的应用
    在数字化时代,营销活动的多样性和复杂性使得评估其效果成为一项挑战。营销归因模型应运而生,为SaaS企业等提供了科学、系统的评估工具。本文将简要介绍什么是营销归因模型,阐述其带来的好处,并探讨SaaS企业可以采用的营销归因系统。什么是营销归因模型?营销归因模型是一种方法论,......
  • 维护合作伙伴关系与直接销售:SaaS渠道商如何解决2024运营难题?
    随着科技的飞速发展和市场竞争的日益激烈,SaaS(Software as a Service)行业正步入一个充满挑战与机遇并存的新时代。对于SaaS渠道商而言,2024年无疑是一个考验其战略眼光与运营能力的关键年份。面对市场环境的快速变化、客户需求的日益多样化以及合作伙伴关系的微妙调整,SaaS渠......
  • 智胜未来:AI如何重塑SaaS用户增长战略
    在当今这个数字化时代,SaaS(软件即服务)已成为企业运营的重要支柱,而人工智能(AI)技术的迅猛发展,正以前所未有的方式重塑着SaaS行业的面貌,特别是对其用户增长战略产生了深远影响。本文将以“智胜未来:AI如何重塑SaaS用户增长战略”为题,探讨AI技术如何为SaaS企业带来用户增长的新机遇......
  • mysql日志
    日志类型查询日志日志类型描述查询文件开启方式一般查询日志记录服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,generallog都会将其记录下来SHOWVARIABLESLIKE'general_log_file';SETGLOBALgeneral_log='ON';慢......
  • MySQL—常用的数据类型
    数据类型整型1.创建一个含有无符号/有符号整型的字段的表CREATETABLEL1( idtinyintunsigned#无符号)CREATETABLEL2( idtinyint#默认为有符号)数值型(bit)2.数值型(bit)的使用小数3.数值型(小数)的基本使用 字符串4.字符串的基本使用#演示字符......
  • MySQL5.7.x绿色版安装过程
    MySQL5.7.x绿色版安装过程记一下自己安装MySQL的过程,方便以后用官网下载MySQL5.7.x绿色版压缩包我这里使用的是mysql-5.7.42-winx64.zip解压,并配置环境变量(可选)环境变量要配置到MySQL目录下的bin目录例如:C:\DevelopmentTools\mysql-5.7.42-winx64\bin在MySQL目录......
  • MySQL中的可插拔身份验证(Pluggable Authentication)(二)
    PluggableAuthentication(PAM,即可插拔式认证模块)是一种高效且灵活的用户级别的认证方式,广泛应用于现代操作系统,特别是Linux服务器中。它允许数据库管理员(DBAs)为MySQL用户帐户选择和更改不同的认证方法。1身份验证插件客户端/服务器兼容性可插拔身份验证使MySQL帐户在选择身......