这是这个的后续Spring JPA 的多租户
我选择使用“AbstractRoutingDataSource”。但现在的问题是数据源和实体管理器 bean 在启动时初始化。无论如何,有没有在春天配置这个,它会在用户通过身份验证后初始化?
我能想到的另一个问题是如何处理并发。我把tenantId放在这个类中
public class ThreadLocalContextUtil {
private static final ThreadLocal<String> contextHolder =
new ThreadLocal<String>();
public static void setTenantId(String tenantId) {
Assert.notNull(tenantId, "customerType cannot be null");
contextHolder.set(tenantId);
}
public static String getTenantId() {
return (String) contextHolder.get();
}
public static void clearTenant() {
contextHolder.remove();
}
}
我能想到的解决方案是在数据源初始化后删除tenantId。那是对的吗?
我已经解决了类似的问题。我实现了我自己的TenantAwareDataSource
基于 Spring 的AbstractDataSource
。它需要tenantId来自名为的会话范围 bean租户上下文。每次处理传入请求时都会更新此 bean。这是通过使用 Spring Security 的安全过滤器来完成的:
<security:http auto-config='false' >
<security:custom-filter before="FIRST" ref="tenantFilter" />
<!-- ...more security stuff... -->
</security:http>
My TenantAwareDataSource
在启动时初始化,但这并不重要,因为它是空创建的 - 它包含没有租户数据源(例如,池化 JDBC 数据源或 JPA 实体管理器)。它们是在以下情况下延迟创建的:getConnection()
为所选租户首次调用。
So, my TenantAwareDataSource
维护自己的动态数据源映射,同时AbstractRoutingDataSource
期望在启动时完成数据源映射的静态初始化。
在此阅读更详细的描述article.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)