Java 数据库多租户与新线程
我已经在spring boot应用程序中使用Java 数据库多租户与新线程,java,multithreading,spring-boot,spring-data-jpa,multi-tenant,Java,Multithreading,Spring Boot,Spring Data Jpa,Multi Tenant,我已经在spring boot应用程序中使用MultiTenantConnectionProvider和CurrentTenantIdentifierResolver 我有一个连接到db的静态实例和一个Multientant的动态实例, 在我被迫使用多重威胁之前,一切都很顺利 新线程似乎丢失了关于动态连接的信息(静态连接很好),所以我有一个问题,是否有可能像我通常做的那样,将连接信息传递给新线程以使用JPA存储库 感谢您的回答和建议请使用此处解释的租户上下文- 每次调用新线程时,请确保重置上下文
MultiTenantConnectionProvider
和CurrentTenantIdentifierResolver
我有一个连接到db的静态实例和一个Multientant的动态实例,
在我被迫使用多重威胁之前,一切都很顺利
新线程似乎丢失了关于动态连接的信息(静态连接很好),所以我有一个问题,是否有可能像我通常做的那样,将连接信息传递给新线程以使用JPA存储库
感谢您的回答和建议请使用此处解释的租户上下文-
每次调用新线程时,请确保重置上下文,因为新线程将丢失当前租户的标识符信息 将请求中的租户id/信息作为URL的一部分或在标头中传递,并使用筛选器通过租户持有者/上下文将其设置为ThreadLocal 我在博客上写了这个
我将很快在博客上介绍如何通过租户存储传递租户数据,以防止直接干扰ThreadLocal,并支持在服务、资源等中注入租户存储。我们需要的是将租户id从当前线程传递到新创建的线程,以在多租户模式下工作。为此,我们必须维护租户上下文,如下所示:
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();
}
}
new TenantAwareThread(() -> {
//do operation
}).start();
最后,我们可以创建如下线程:
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();
}
}
new TenantAwareThread(() -> {
//do operation
}).start();
新线程将自动获取租户ID并正确访问正确租户的数据库。我也有同样的问题,如果有人有解决方案并可以回复,那就太好了。感谢如果多租户在多线程中失败,那真的是一个bug。但不确定情况是否如此。我正在使用ExecutorService,它似乎丢失了关于当前租户标识的信息。我实际上是在使用你的博客作为实现多租户的示例,但问题是没有关于新线程上显示的实际租户的信息。我没有得到“关于新线程上显示的实际租户的任何信息”你能详细说明一下吗?如果我没记错的话,如果没有传递租户id,它会在ResolverImpl类相关博客中解析为“租户1”: