apache / apache/incubator-seata-samples
springcloud-eureka-feign-mybatis-seata 多数据源的问题
- 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
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