SpringBoot采用方法名和注解实现数据库的读写分离并且有事务回滚

本文详细介绍使用SpringBoot实现数据库读写分离的两种方法:基于方法名前缀和基于注解的方式。通过具体代码示例展示了如何配置数据源、实现动态数据源切换,并通过事务拦截器确保事务的一致性。

SpringBoot实现读写分离有两种方式
第一种是根据方法名,比如"select、get、query"开头的方法走从库,其余的走主库
第二种就是注解式,在方法上加上注解,里面指定走主库还是从库。
一、下面我先介绍第一种方式,直接上代码。
configure.properties

spring.datasource.server.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.server.username=root
spring.datasource.server.password=123456

spring.datasource.server.slave.url=jdbc:mysql://localhost:test-slave/?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.server.slave.username=root
spring.datasource.server.slave.password=123456

application.yml,master是主库,slave是从库

spring:
  datasource:
    master:
      username: ${spring.datasource.server.username}
      password: ${spring.datasource.server.password}
      url: ${spring.datasource.server.url}
    slave:
      username: ${spring.datasource.server.slave.username}
      password: ${spring.datasource.server.slave.password}
      url: ${spring.datasource.server.slave.url}

1.DataSourceConfig数据源加载类

@Configuration
@MapperScan(basePackages = "com.aaa.bbb.mapper", sqlSessionTemplateRef = "sqlTemplateTest")
public class DataSourceConfig {


    /**
     * 主库
     */
    @Bean(name="master")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource master() {
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 从库
     */
    @Bean(name="slave")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slave() {
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 实例化数据源路由
     */
    @Bean(name="dynamicDBTest")
    public DataSourceRouter dynamicDBTest(@Qualifier("master") DataSource masterDataSource,
                                      @Autowired(required = false) @Qualifier("slave") DataSource slaveDataSource) {
        DataSourceRouter dynamicDataSource = new DataSourceRouter();
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("master", masterDataSource);
        if (slaveDataSource != null) {
            targetDataSources.put("slave", slaveDataSource);
        }
        dynamicDataSource.setTargetDataSources(targetDataSources);
        dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
        return dynamicDataSource;
    }
    /**
     * 配置sessionFactory
     */
    @Bean
    public SqlSessionFactory sessionFactory(@Qualifier("dynamicDBTest") DataSource dynamicDataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:com/aa/bb/cc/mapper/**/*.xml"));
        bean.setDataSource(dynamicDataSource);
        return bean.getObject();
    }


    /**
     * 创建sqlTemplate
     */
    @Bean
    public SqlSessionTemplate sqlTemplateTest(@Qualifier("sessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    /**
     * 事务配置
     */
    @Bean(name = "dataSourceTx")
    public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("dynamicDBTest") DataSource dynamicDataSource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dynamicDataSource);
        return d
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值