### 前言
- 作为多租户系统,有些库即有区分租户又有不区分租户的表,所以不能直接分库,但有些表数据量比较大,需要按租户分表
实现原理
- 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
