apache / apache/incubator-seata-samples

springcloud-eureka-feign-mybatis-seata 多数据源的问题

Open
#252 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
2.4k
Forks
2k
PR merge metrics
No merged PRs in 30d

Description

小伙伴们springcloud-eureka-feign-mybatis-seata 知道如何配置多个数据源吗?我配置的2个数据源在没有集成seata的时候是完全可用的,集成seata以后调用第二个数据源时也是用的seata主数据源的代理,没有使用第二个数据源代理:
第一个数据源配置:
/**
* 说明:第一数据源配置
*/
@Configuration
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory") //扫描 Mapper 接口并容器管理
public class MasterDataSourceConfig {

static final String PACKAGE = "org.fh.mapper.dsno1"; //master 目录
static final String MAPPER_LOCATION = "classpath:mybatis/dsno1/*/*.xml"; //扫描的 xml 目录
static final String CONFIG_LOCATION = "classpath:mybatis/dsno1/mybatis-config.xml"; //自定义的mybatis config 文件位置
static final String TYPE_ALIASES_PACKAGE = "org.fh.entity"; //扫描的 实体类 目录
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
@Primary
@Bean("dataSourceProxy")
public DataSourceProxy dataSource(DataSource masterDataSource){
return new DataSourceProxy(masterDataSource);
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager(DataSourceProxy dataSourceProxy) {
return new DataSourceTransactionManager(dataSourceProxy);
}

@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dataSourceProxy") DataSourceProxy dataSourceProxy)throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceProxy);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MasterDataSourceConfig.MAPPER_LOCATION));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(MasterDataSourceConfig.CONFIG_LOCATION));
sessionFactory.setTypeAliasesPackage(MasterDataSourceConfig.TYPE_ALIASES_PACKAGE);
return sessionFactory.getObject();
}
}

/**
* 说明:第二数据源配置
*/
@Configuration
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "master1SqlSessionFactory") //扫描 Mapper 接口并容器管理
public class MasterDataSourceConfig {

static final String PACKAGE = "org.fh.mapper.dsno2"; //master 目录
static final String MAPPER_LOCATION = "classpath:mybatis/dsno2/*/*.xml"; //扫描的 xml 目录
static final String CONFIG_LOCATION = "classpath:mybatis/dsno2/mybatis-config.xml"; //自定义的mybatis config 文件位置
static final String TYPE_ALIASES_PACKAGE = "org.fh.entity"; //扫描的 实体类 目录
@Bean
@ConfigurationProperties(prefix = "spring.datasource1")
public DataSource druidDataSource1(){
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}

@Bean("dataSourceProxy1")
public DataSourceProxy dataSource(DataSource druidDataSource1){
return new DataSourceProxy(druidDataSource1);
}
@Bean(name = "master1TransactionManager")
public DataSourceTransactionManager masterTransactionManager(DataSourceProxy dataSourceProxy) {
return new DataSourceTransactionManager(dataSourceProxy);
}

@Bean(name = "master1SqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dataSourceProxy1") DataSourceProxy dataSourceProxy)throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceProxy);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MasterDataSourceConfig.MAPPER_LOCATION));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(MasterDataSourceConfig.CONFIG_LOCATION));
sessionFactory.setTypeAliasesPackage(MasterDataSourceConfig.TYPE_ALIASES_PACKAGE);
return sessionFactory.getObject();
}
}

Contributor guide

Open the contributing guide

Research direction

Start by comparing the two inline data-source configuration classes, especially their bean names, mapper scans, qualifiers, proxies, and transaction managers. Reproduce a call through the second mapper with Seata enabled and trace which DataSourceProxy is selected. Done means the second data source consistently uses its own Seata proxy without breaking the first data source.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, spring, spring-boot
Domain
backend, databases, distributed-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.