Spring AbstractRoutingDataSource正在缓存Datasource

时间:2017-05-25 14:39:46

标签: spring

我在Tomcat上部署了一个Spring MVC应用程序作为多租户(单实例)。所有用户都登录到同一个应用程序。

用户属于某个区域,每个区域都有一个单独的数据库实例。

我们使用Spring AbstractRoutingDataSource"。

使用动态数据源路由

这仅适用于第一次,当Region_1的User_1登录到应用程序时,Datasource_1被正确分配。

但随后当来自Reqion_2的User_2登录到应用程序时,AbstractRoutingDataSource永远不会被调用并且Datasource_1被分配。

看起来Spring AbstractRoutingDataSource正在缓存Datasouce。

有没有办法改变AbstractRoutingDataSource的这种行为并使其正常工作?

1 个答案:

答案 0 :(得分:0)

您应该提供更多详细信息,以便更好地理解。

我认为问题可能与更改租户标识符有关。您可能有一个ThreadLocal存储设备来存储租户标识符。

public class ThreadLocalStorage {

    private static ThreadLocal<String> tenant = new ThreadLocal<>();

    public static void setTenantName(String tenantName) {
        tenant.set(tenantName);
    }

    public static String getTenantName() {
        return tenant.get();
    }
}

AbstractRoutingDataSource应该使用它来检索tenantId

public class TenantAwareRoutingDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return ThreadLocalStorage.getTenantName();
    }
}

并且您应该在处理该请求的当前线程的每个请求上设置tenantId,以便在正确的数据库上执行以下操作。因为您可以添加Spring Security过滤器以从JWT令牌或主机子域中提取租户标识符。