
文章目录
前言
工作中我们可能会遇到的一个问题,可能会出现多租户场景,这种情况下,我们不得不对我们的系统分库,对于每一个租户来说都是一个数据库,这个我们可能考虑到多数据源去解决,也是一个思路,这几天调研了mycat做分库,下面慢慢分享这一个过程。
如何获取当前线程的租户
我们首先要解决这个问题,今天首先要出场的是ThreadLocal,对于这个类我的解释是:
- 保存线程上下文信息,在任意需要的地方可以获取!!!
- 线程安全的,避免某些情况需要考虑线程安全必须同步带来的性能损失!!!
之前看过阿里规范有这条:

实现
首先来一个接口BatmanTenant,这个接口主要封装两个方法。
public interface BatmanTenant {
void setBatmanTenantId(String var1);
String getBatmanTenantId();
}
接着创建一个实现类TenantStore去实现BatmanTenant,一个静态变量CONTEXT存取上下文的租户信息。
public class TenantStore implements BatmanTenant {
private static final ThreadLocal<String> CONTEXT = new TransmittableThreadLocal<>();
private static boolean isApplicationTenant = false;
private static String applicationTenantId;
private static final String TENANT_DEFAULT_ID = "t0";
public static void setTenantId(String tenantId) {
CONTEXT.set(tenantId);
}
public static String getTenantId() {
if (isApplicationTenant) {
return applicationTenantId;
}
String tenantId = CONTEXT.get();
if (tenantId == null || "".equals(tenantId)) {
tenantId = TENANT_DEFAULT_ID;
}
return tenantId;
}
public static void clear() {
CONTEXT.remove();
}
public static boolean isApplicationTenant() {
return isApplicationTenant;
}
public static void setApplicationTenant(boolean applicationTenant) {
isApplicationTenant = applicationTenant;
}
public static String getApplicationTenantId() {
return applicationTenantId;
}
public static void setApplicationTenantId

本文详细介绍了如何在多租户环境中使用Mycat进行数据库分库分表,并通过MyBatis拦截器实现租户ID注入,确保数据隔离。文章覆盖了Mycat服务搭建、配置、测试流程,以及MyBatis拦截器的实现与配置。
最低0.47元/天 解锁文章
8770

被折叠的 条评论
为什么被折叠?



