【问题标题】:Spring boot AbstractRoutingDataSourceSpring Boot AbstractRoutingDataSource
【发布时间】:2016-10-13 08:59:19
【问题描述】:

我正在尝试使用 AbstractRoutingDataSource 创建一个动态数据源(基于会话),但 Spring Boot 在启动时继续调用 AbstractRoutingDataSource 的 determineCurrentLookupKey() 函数。

@ConfigurationProperties(prefix = "datasource.int")
@Bean
public DataSource internal() {
    return DataSourceBuilder.create().build();

}

@ConfigurationProperties(prefix = "datasource.ext")
@Bean
public DataSource external() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "dataSource")
@Qualifier("dataSource")
public DynamicRoutingDataSourceResolver dataSource() {
    DynamicRoutingDataSourceResolver resolver = new DynamicRoutingDataSourceResolver();
    DataSource internal = internal();
    DataSource external = external();
    Map<Object, Object> dataSources = new HashMap<>();
    dataSources.put(env.getRequiredProperty("app.param.int"), internal);
    dataSources.put(env.getRequiredProperty("app.param.ext"), external);
    resolver.setDefaultTargetDataSource(internal);
    resolver.setTargetDataSources(dataSources);
    resolver.afterPropertiesSet();

    return resolver;
}

public class DynamicRoutingDataSourceResolver extends  AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {

    HttpServletRequest request = ((ServletRequestAttributes)  RequestContextHolder.getRequestAttributes()).getRequest();
    Object o = request.getSession().getAttribute(Constant.DATASOURCE);
    return o;

}

}

它抛出 NullPointerException 因为 RequestAttributes 为空。 我尝试将@Primary 放入其中一个数据源,但是当我尝试执行查询时没有触发 AbstractRoutingDataSource determineCurrentLookupKey()。

我正在使用 Spring Data jpa。

另见session based data source

【问题讨论】:

    标签: hibernate spring-boot datasource spring-data-jpa multi-tenant


    【解决方案1】:

    您不必在此处指定任何形式的@Primary

    只需创建所有数据源并将其分配给AbstractRoutingDataSource。如果有一个数据源是默认的,也可以使用#setDefaultTargetDataSource 设置它,就像您的代码显示的那样。

    在您的情况下,NullPointerException 只是您的代码需要防范的东西。如果您发现您的请求数据不存在于您的解析器中,只需为数据源查找键返回一个 null 值。

    AbstractRoutingDataSource 使用定义的默认数据源,如果返回的查找键是 null 或指定的键没有通过查找映射定义为数据源。

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2015-04-30
      • 2016-09-13
      • 1970-01-01
      • 2014-11-28
      相关资源
      最近更新 更多