集成fescar数据源循环依赖错误解决方案

文章目录

  • 1项目简介
  • 2 错误日志
  • 3 循环依赖错误原因
    • 3.1 错误调试发现步骤
      • 3.1.1 创建 sqlSessionFacotry
      • 3.1.2 创建 fescarDataSource
      • 3.1.3 创建 druidDataSource
      • 3.1.4 关键:调用 DataSourceInitializerPostProcessor#postProcessAfterInitialization
      • 3.1.5 这一步出错!:调用 DataSourceInitializerInvoker#afterPropertiesSet
  • 4 三种解决方案
    • 4.1 移除数据源自动配置类
    • 4.2 调整 beanDefinition 初始化的顺序就可以避免循环依赖
    • 4.3 初始化主数据源的时候不要依赖其它数据源
  • 5 总结
  • 参考



1项目简介

  • 集成 fescar 做分布式事务一致性实验
  • 首先 zookeeperfescar-server 已经开启了
  • 该模块是 fescar-client,需要自定义数据源
  • fescar.version: 0.1.3
//fescar数据源配置
@Configuration
public class DruidConfig {
   
    //配置一个DruidDataSource:必须是DruidDataSource
    @Bean("druidDataSource")    
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource() {
   
        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;
    }
    //这是fescar需要的dataSource:其中DataSourceProxy的参数必须是DruidDataSource
    @Primary
    @Bean("fescarDataSource")
    public DataSource dataSource(DruidDataSource druidDataSource) {
   
        DataSourceProxy dataSourceProxy = new DataSourceProxy(druidDataSource);
        return dataSourceProxy;
    }


2 错误日志

集成fescar数据源循环依赖错误解决方案_第1张图片

3 循环依赖错误原因

  • DataSourceAutoConfiguration 中注册了dataSourceInitializerPostProcessor 后置处理器
  • 它在第一次初始化数据源时会被触发,会去初始化主数据源,如果第一次初始化的是主数据源,就会导致数据源初始化循环依赖

3.1 错误调试发现步骤

3.1.1 创建 sqlSessionFacotry

@Bean
@ConditionalOnMissingBean
//关键:构造器注入dataSource,这里注入的是fescarDataSource(因为被@Primay注解了)
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
   }

3.1.2 创建 fescarDataSource

@Primary
@Bean("fescarDataSource")
//需要递归创建 druidDataSource
public DataSource dataSource(DruidDataSource druidDataSource) {
   

你可能感兴趣的:(springboot,springboot,循环依赖,多数据源,fescar)