【问题标题】:Create tenant database programatically以编程方式创建租户数据库
【发布时间】:2020-09-10 08:19:23
【问题描述】:

我有一个使用 Spring Boot 开发的多租户应用程序。在主表中,我保存有关租户数据库的信息。我正在尝试创建一个服务,它从主表接收一行并为其创建数据库。在 Spring Boot 中是否有已知的方法可以做到这一点?我可以在 Internet 上找到的唯一信息是在应用程序启动时创建,这是不希望的。主租户表在主模式中,具有以下结构:

来自服务的方法如下:

public void createTenant(TenantDTO tenantDTO) {
    tenantepository.save(new Tenant(tenantDTO));
    MasterTenant masterTenant = new MasterTenant();
    masterTenant.setDbName(tenantDTO.getTenantId());
    masterTenant.setDriverClass("com.mysql.jdbc.Driver");
    masterTenant.setTenantId(tenantDTO.getTenantId());
    masterTenant.setPassword("password");
    masterTenant.setStatus(EStatus.ACTIVE.name());
    masterTenant.setUserName("root");
    masterTenant.setUrl("jdbc:mysql://localhost:3306/"+tenantDTO.getTenantId());
    DBContextHolder.setCurrentDb(masterTenant.getDbName());
    masterTenantRepository.save(masterTenant);
    multiTenantConnectionProvider.selectDataSource(masterTenant.getTenantId());
    //create schema + create tables from existing entities or run a script of sql
}

我需要帮助找出创建模式和表的部分。

【问题讨论】:

    标签: database spring-boot hibernate jpa multi-tenant


    【解决方案1】:

    我能想到的一个选项是拥有像 Jenkins 或 AWS Lambda 这样的后端,您可以向其发出在服务器池中创建数据库的请求。

    在选择 Jenkins 作业的情况下,您有 Jenkins 公开的 REST API,您可以利用它来触发作业。由于它与开发操作更相关,您可以在 jenkins 作业中使用类似 terraform 的脚本,该脚本接受租户 id 作为参数来将其设置为数据库名称等。

    使用 Jenkins 作业的一些优点是

    • 作业可能会长时间运行
    • 支持排队
    • 可以轻松地与 devops 集成并删除与应用程序的依赖关系
    • 基于 API 的访问来触发作业、查看状态和日志等。

    【讨论】: