Java 数据库多租户与新线程

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存储库 感谢您的回答和建议请使用此处解释的租户上下文- 每次调用新线程时,请确保重置上下文

我已经在spring boot应用程序中使用
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”: