SpringBoot配置多数据源

SpringBoot多数据源

maven

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>

application.yml

datasource:
    druid: # Druid数据源配置
      driver-class-name: com.mysql.jdbc.Driver
      master:
        url: jdbc:mysql://127.0.0.1:3306/jframe?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
        username: root
        password: 12345678
      cluster:
        url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
        username: root
        password: 12345678

DbMasterConfig

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.jf.mapper", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class DbMasterConfig {
    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.druid.master")
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) {
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(masterDataSource);
            // we MUST set the 'VFS' if you use jar
            bean.setVfs(SpringBootVFS.class);
            // 实体类位置
            bean.setTypeAliasesPackage("com.jf.model");
            // 设置mapper.xml文件所在位置
            org.springframework.core.io.Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/jf/mapper/xml/*.xml");
            bean.setMapperLocations(resources);

            // 添加分页插件
            PageInterceptor pageHelper = new PageInterceptor();
            Properties p = new Properties();
            p.setProperty("helperDialect", "mysql");
            p.setProperty("supportMethodsArguments", "true");
            p.setProperty("params", "pageNum=pageNo;pageSize=pageSize;");
            pageHelper.setProperties(p);
            Interceptor[] plugins = new Interceptor[]{pageHelper};
            bean.setPlugins(plugins);

            return bean.getObject();
        } catch (Exception e) {
            logger.error("DB Master sqlSessionFactory create error!", e);
            return null;
        }
    }

    @Bean
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    /**
     * 事务管理
     *
     * @return
     */
    @Bean
    @Primary
    public PlatformTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource masterDataSource) {
        return new DataSourceTransactionManager(masterDataSource);
    }
    
}

DbClusterConfig

DbClusterConfig类似,修改MapperScanMapperLocations位置,删除@Primary,将clusterDataSource注入

测试

Service

public User testMutilSource(String source) {
    User user = null;
    if ("master".equals(source)) {
        user = userMapper.findById(10000l);
    }
    if ("cluster".equals(source)) {
        user = user2Mapper.findById(10000l);
    }
    return user;
}
    
@Transactional(value = "masterTransactionManager")
public void testRollbackA() {
    User user = userMapper.findById(10000l);
    user.setNickname("master_rollback");
    userMapper.update(user);
    System.out.println(1 / 0); // error
    user = new User(10001l);
    user.setNickname("master_rollback2");
    userMapper.update(user);
}

@Transactional(value = "clusterTransactionManager")
public void testRollbackB() {
    User user = user2Mapper.findById(10000l);
    user.setNickname("cluster_rollback");
    user2Mapper.update(user);
    System.out.println(1 / 0);
    user = new User(10001l);
    user.setNickname("cluster_rollback2");
    user2Mapper.update(user);
}

两个数据源均生效,并正常执行事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值