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

本文介绍了在集成Fescar进行分布式事务一致性实验时遇到的数据源循环依赖错误,详细分析了错误原因及三种解决方案:移除数据源自动配置类、调整beanDefinition初始化顺序和初始化主数据源时避免依赖其他数据源。通过理解SpringBoot初始化过程和bean的生命周期,可以有效避免此类问题。
摘要由CSDN通过智能技术生成



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 错误日志

在这里插入图片描述

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) {
   
    DataSourceProxy dataSourceProxy = new DataSourceProxy(druidDataSource);
    return dataSourceProxy;
}

3.1.3 创建 druidDataSource

@Bean("druidDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值