在我的春季项目中,我为不同的用户使用不同的数据库。为了支持这一点,我配置了AbstractRoutingDataSource bean。
这是我的代码:
@Primary
@Bean(name="routingDatasource")
public AbstractRoutingDataSource routingDatasource()
{
Map<Object, Object> targetDataSources=new HashMap<Object, Object>();
targetDataSources.put(Db.comp1,dataSourceComp1());
targetDataSources.put(Db.comp2,dataSourceComp2());
AbstractRoutingDataSource dataSrc=new AbstractRoutingDataSource() {
@Override
protected Object determineCurrentLookupKey() {
return DataBaseRouteFixer.getKey();
}
};
dataSrc.setDefaultTargetDataSource(dataSourceComp2());
dataSrc.setTargetDataSources(targetDataSources);
System.out.println("abstract routing data source created");
return dataSrc;
}
Db是一个枚举,在Db我定义了一堆用户密钥。
数据库路线修复:
@Component
public class DataBaseRouteFixer {
private static final ThreadLocal<Db> route=new ThreadLocal<Db>();
public static Db getKey() {
return route.get();
}
public static void setKey(Db key) {
route.set(key);
}
切换控制器中数据库的代码:
DataBaseRouteFixer.setKey(Db.comp1);
它正常工作,但是当我切换数据库时,同样的更改也会影响其他用户。我希望它为每个用户切换不同的数据库,我该怎么做?
答案 0 :(得分:2)
就我而言,很难在多个用户之间实现抽象数据源路由。我需要使用hibernate来解决这个问题。我实际上正在寻找的是多租户。
答案 1 :(得分:0)
我建议创建代理DataSource,它可以根据线程局部变量将所有调用委托给从targetDataSources映射中获取的正确的真实DataSource。
public class ProxyDataSource implements DataSource {
...
@Override
public Connection getConnection() throws SQLException {
return getRealDataSource().getConnection();
}
...
}
并使用您需要数据源的代理。
答案 2 :(得分:0)
OP需要为每个用户或一组用户提供不同的数据库。
您可以将spring会话bean用于有状态的bean,并且每个用户的状态不同。这些可以是当前登录用户的首选项。
spring中bean的默认范围是singleton,在Web Application上下文中没有区别。