JooLun Plus 百科 ⬇ 源码下载

03.07 多租户分表

JooLun 于 2026-10-21 14:40:14 +08:00 修改了此页面

### 前言

  • 作为多租户系统,有些库即有区分租户又有不区分租户的表,所以不能直接分库,但有些表数据量比较大,需要按租户分表

实现原理

  • mybatisPlus多租户+动态表名
  • 请先查看【多租户功能】文档

实现逻辑

在mybatis plus拦截器中添加动态表名处理

核心代码ShardingTableHandler

    /**
     * 分表实现 动态表名处理器
     * 根据当前租户ID自动拼接表名
     *  @author www.joolun.com
     */
	@Override
	public String dynamicTableName(String sql, String tableName) {
		String tenantId = TenantContextHolder.getTenantId();
		if(StrUtil.isNotBlank(tenantId)
				&& !StrUtil.equals(tenantId, CommonConstants.SYSTEM_TENANT_ID)
				&& shardingTableProperties.getTables().contains(tableName)){
			//表名后加拼接租户ID
			return StrUtil.format("{}_{}", tableName, tenantId);
		}
		return tableName;
	}

配置要分表的表名,如joolun-upms-admin-dev.yml

base:
  # 分表配置
  shardingtable:
    tables:
      - sys_log
      - sys_log_login

初始化租户数据库

  • 和分库一样在添加租户的时候我们还需给新租户生成数据库表,SysTenantServiceImpl.initTenantDataBase方法根据上述配置的base.shardingtable.tables表名为新租户克隆新表
  • 后台租户管理调用

已实现分表的表

  • joolun_plus_wx.wx_user
  • joolun_plus_wx.wx_msg
  • joolun_plus_upms.sys_log
  • joolun_plus_upms.sys_log_login