gpt4 book ai didi

java - 数据库 Multi-Tenancy 和新线程

转载 作者:行者123 更新时间:2023-12-03 12:54:29 25 4
gpt4 key购买 nike

我已经在我的Spring-boot应用程序中使用MultiTenantConnectionProviderCurrentTenantIdentifierResolver实现了数据库 Multi-Tenancy

我有一个连接数据库的静态实例,一个由 Multi-Tenancy 动态连接的实例,
一切正常,直到我被迫使用多重处理。

New Thread似乎松散了有关该动态连接的信息(静态很好),所以我有一个问题,是否可以像往常一样将连接信息传递给新线程以使用JPA Repository?

感谢您的回答和建议

最佳答案

我们需要的是将租户ID 从当前线程传递到新创建的线程,以在 Multi-Tenancy 模式下工作。为此,我们必须维护TenantContext,如下所示:

public class TenantContext {
private static final ThreadLocal<Tenant> tenantHolder = new ThreadLocal<>();

public static Tenant getTenant() {
Tenant tenant = tenantHolder.get();
return Objects.isNull(tenant) ? Tenant.DEFAULT : tenant;
}

public static void setTenant(Tenant tenant) {
tenantHolder.set(tenant);
}

public static void clearTenant() {
tenantHolder.remove();
}
}

租户是包含所有租户ID的枚举。在创建新线程之前首先解析租户时,我们必须将其设置为 TenantContext

现在,我们必须编写新的自定义线程类。
public class TenantAwareThread extends Thread {
private Tenant tenant = null;

public TenantAwareThread(Runnable target) {
super(target);
this.tenant = TenantContext.getTenant();
}

@Override
public void run() {
TenantContext.setTenant(this.tenant);
super.run();
TenantContext.clearTenant();
}
}

最后,我们可以创建线程,如下所示:
new TenantAwareThread(() -> {
//do operation
}).start();

新线程将自动获取租户ID,并正确访问正确的租户数据库。

关于java - 数据库 Multi-Tenancy 和新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45918239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com