Discuss / Java / 一个应用多数据库

一个应用多数据库

Topic source

之前有想过:

1. 根据请求参数,在拦截器中动态的创建对应数据源,连接session和事务,注入spring容器中

2. 预先将所有数据源添加到容器,从容器中获取对应数据源,再生成连接sessino和事务注入容器,和第一种差不多,但是spring提供的这个AbstractRoutingDataSource相当给力,用一个路由数据源代替真正的数据源使用@Primary注解在调用的时候动态切换数据源,真香

RoutingDataSource

public class RoutingDataSource extends AbstractRoutingDataSource {
    final Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    protected DataSource determineTargetDataSource() {
        DataSource ds = super.determineTargetDataSource();
        logger.error("determin target datasource: {}", ds);
        return ds;
    }
    @Override
    protected Object determineCurrentLookupKey() {
        // 从ThreadLocal中取出key:
        return RoutingDataSourceContext.getDataSourceRoutingKey();
    }
}

RoutingDataSourceContext

public class RoutingDataSourceContext implements AutoCloseable {
    static final ThreadLocal<String> ctx = new ThreadLocal<>();
    public static void setDataSourceRoutingKey(String str) {
        ctx.set(str);
    }
    public static String getDataSourceRoutingKey() {
        return ctx.get();
    }
    @Override
    public void close() throws Exception {
        ctx.remove();
    }
}

  • 1

Reply