多租户分库分表同步数据库DDL脚本

我们在实现多租户系统的时候,为了数据安全和性能,往往会把数据库设计成一个租户一个数据库,如下图,主库记录了租户信息和对应的数据库地址,租户数据库则存储了租户相关的数据,租户数据库的表结构都是一致的,这种方式有个痛点就是变更表结构非常麻烦,需要一个个数据库去变更,幸运的是可以通过一段代码来实现SQL脚本的同步

使用工具类:Hutool

// 同步多租户脚本
@Slf4j
public class SQLSyncTest {
    @Test
    public void syncSQL() {
        String mainDBUrl = "";
        String mainDBUsername = "";
        String mainDBPassword = "";
        String tenantSQL = "sql脚本";
        boolean existOnException = false; //遇到错误是否退出
        List<String> excludeTenantCodes = Arrays.asList("xxx"); //不执行脚本的租户code
        try {
            // 建立与主库的连接,获取租户库账号
            DataSource ds = new SimpleDataSource(mainDBUrl, mainDBUsername, mainDBPassword);
            List<Entity> tenantInfos = Db.use(ds).query("select * from main_datasource");
            for (Entity tenantInfo : tenantInfos) {
                String tenantCode = tenantInfo.getStr("tenant_code");
                if (excludeTenantCodes.contains(tenantCode)) continue;
                try {
                    // 组装租户库账号
                    String tenantDBUrl = StrUtil.format("jdbc:mysql://{}:{}/{}"
                            , tenantInfo.getStr("ip")
                            , tenantInfo.getStr("port")
                            , tenantInfo.getStr("database_name"));
                    String tenantDBUsername = tenantInfo.getStr("user_name");
                    String tenantDBPassword = tenantInfo.getStr("password");
                    DataSource tenantDS = new SimpleDataSource(tenantDBUrl, tenantDBUsername, tenantDBPassword);
                    // 执行同步脚本
                    int result = Db.use(tenantDS).execute(tenantSQL);
                    log.info("租户: {}执行成功,成功数: {}", tenantCode, result);
                } catch (Exception e) {
                    log.error("租户: {}出错, {}", tenantCode, e);
                    if (existOnException) return;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

相关推荐

  1. Mybatis-Plus同时实现租户模式

    2024-07-22 21:28:06       54 阅读
  2. 数据库分库

    2024-07-22 21:28:06       23 阅读
  3. 关于数据库分库

    2024-07-22 21:28:06       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 21:28:06       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 21:28:06       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 21:28:06       45 阅读
  4. Python语言-面向对象

    2024-07-22 21:28:06       55 阅读

热门阅读

  1. 深度学习中的损失函数和网络优化方法

    2024-07-22 21:28:06       13 阅读
  2. VUE复习

    VUE复习

    2024-07-22 21:28:06      10 阅读
  3. Unity扩展 UI线段绘制组件——UI上的LineRenderer

    2024-07-22 21:28:06       14 阅读
  4. IDM破解

    IDM破解

    2024-07-22 21:28:06      12 阅读
  5. 通过Python面向对象编程探索克苏鲁神话

    2024-07-22 21:28:06       13 阅读
  6. 【论文精读】Fully Sparse 3D Occupancy Prediction

    2024-07-22 21:28:06       16 阅读
  7. 如何在Linux中打开core文件

    2024-07-22 21:28:06       13 阅读
  8. 数据仓库中的数据治理流程

    2024-07-22 21:28:06       12 阅读
  9. 数据结构(特殊二叉树-线索二叉树)

    2024-07-22 21:28:06       13 阅读
  10. 代码重构实践分享

    2024-07-22 21:28:06       13 阅读