• Springboot多数据源JdbcTemplate使用(非XA)


    一、预备知识

    首先放一个关于基础spring事务管理机制的说明博客https://www.marcobehler.com/guides/spring-transaction-management-transactional-in-depth

    总的来说,spring通过委托自己的事务管理给TransactionManager对象来进行事务的抽象,以及与不同框架的整合(通过不同的TransactionManager实现)

    二、具体实现

    这个实现只是适用于多数据源,但是多个数据源之间不存在分布式事务的场景

    具体代码编写的过程中参靠了这边博客

    https://blog.csdn.net/yuzongtao/article/details/88888607

    下面是我的代码,首先是数据源,JdbcTemplate,以及适用于JdbcTemplate的事务管理器,DataSourceTransactionManager

    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    @Configuration
    public class DataSourceConfig {
    
      /**
       * b数据源
       * @return
       */
      @Bean(name = "bDataSource")
        @Qualifier("bDataSource")
        @ConfigurationProperties(prefix="spring.datasource.b")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
      /**
       * a数据源
       * @return
       */
        @Bean(name = "aDataSource")
        @Qualifier("aDataSource")
        @Primary
        @ConfigurationProperties(prefix="spring.datasource.a")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
    
        @Bean(name = "bJdbcTemplate")
        public JdbcTemplate primaryJdbcTemplate(
                @Qualifier("bDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    
        @Bean(name = "aJdbcTemplate")
        public JdbcTemplate secondaryJdbcTemplate(
                @Qualifier("aDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
        //事务管理器
        @Bean(name = "bTransactionManager")
        @Qualifier("bTransactionManager")
        public DataSourceTransactionManager bTransactionManager(@Qualifier("bDataSource") DataSource bDataSource) {
          return new DataSourceTransactionManager(bDataSource);
        }
        @Bean(name = "aTransactionManager")
        @Qualifier("aTransactionManager")
        public DataSourceTransactionManager aTransactionManager(@Qualifier("aDataSource") DataSource aDataSource) {
          return new DataSourceTransactionManager(aDataSource);
        }
    
    
    }
    

    具体的application.properties就不贴了,自己自定义一个前缀即可,我这里使用

    #数据库配置信息,多数据源配置
    #b_test库
    spring.datasource.b.jdbc-url=jdbc:mysql://192.168.2.234:3306/b_test?serverTimezone=Asia/Shanghai&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cacheResultSetMetadata=true&maintainTimeStats=false
    spring.datasource.b.username=root
    spring.datasource.b.password=root
    spring.datasource.b.driver-class-name=com.mysql.cj.jdbc.Driver
    #a_test库
    spring.datasource.a.jdbc-url=jdbc:mysql://192.168.2.234:3306/a_test?serverTimezone=Asia/Shanghai&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cacheResultSetMetadata=true&maintainTimeStats=false
    spring.datasource.a.username=root
    spring.datasource.a.password=root
    spring.datasource.a.driver-class-name=com.mysql.cj.jdbc.Driver

    最后一个单词同springboot自动配置情况,具体可以使用STS或者idea进行提示即可

    具体使用则需要在@Transactional显式指明使用哪个事务管理器

      @Transactional(transactionManager = "aTransactionManager")//指定事务管理器,测试通过
      public Map<String, Object> saveLayout(String useruuid, String layout) {
    
        resCount = userDao.saveLayout(useruuid, layout);
        //测试事务管理器是否生效
        //int i = 1/0 
        return resMsg;
      }

    通过指定transactionManager分别为aTransactionManager以及bTransactionManager采用int i = 1/0 抛出运行时异常即可确定配置事务是否生效

  • 相关阅读:
    伯克利推出世界最快的KVS数据库Anna:秒杀Redis和Cassandra
    不要什么都学-打造自己的差异化价值
    gitlab markdown支持页面内跳转
    技术人员怎样提升对业务的理解
    为什么HDFS的副本数通常选择3?
    MySQL++简单使用记录.md
    log4cpp安装使用
    log4cxx安装使用
    epoll使用总结
    工作方法-scrum+番茄工作法
  • 原文地址:https://www.cnblogs.com/marshwinter/p/14518322.html
Copyright © 2020-2023  润新知