我在Tomcat上部署了一个Spring MVC应用程序作为多租户(单实例)。所有用户都登录到同一个应用程序。
用户属于某个区域,每个区域都有一个单独的数据库实例。
我们使用Spring AbstractRoutingDataSource"。
使用动态数据源路由这仅适用于第一次,当Region_1的User_1登录到应用程序时,Datasource_1被正确分配。
但随后当来自Reqion_2的User_2登录到应用程序时,AbstractRoutingDataSource永远不会被调用并且Datasource_1被分配。
看起来Spring AbstractRoutingDataSource正在缓存Datasouce。
有没有办法改变AbstractRoutingDataSource的这种行为并使其正常工作?
答案 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令牌或主机子域中提取租户标识符。