Spring数据库切换适用于所有用户,但不适用于每个用户

时间:2017-02-15 06:37:00

标签: java spring spring-boot

在我的春季项目中,我为不同的用户使用不同的数据库。为了支持这一点,我配置了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);

它正常工作,但是当我切换数据库时,同样的更改也会影响其他用户。我希望它为每个用户切换不同的数据库,我该怎么做?

3 个答案:

答案 0 :(得分:2)

就我而言,很难在多个用户之间实现抽象数据源路由。我需要使用hibernate来解决这个问题。我实际上正在寻找的是多租户。

i found this article helpful

答案 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上下文中没有区别。