1. 程式人生 > 其它 >基於springboot的單應用多資料來源的事務管理簡單實現

基於springboot的單應用多資料來源的事務管理簡單實現

SpringBoot單應用多資料來源的分散式事務管理方案:

  • XA實現方案;

    在java中通過Spring+JTA的方式實現

    在pom檔案中引入jar包:

     <!--jta+atomikos分散式事務-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jta-atomikos</artifactId>
            </dependency>
    

    編寫一個配置資料來源的java類:

    @Configuration 
    @MapperScan(basePackages = {"配置該資料來源配置對應的資料來源(mapper的路徑)"}, sqlSessionFactoryRef = "userdbSqlSessionFactory")
    public class UserDBDataSource4jtaConfig {
        @Value("${spring.datasource.userdb.username}")
        private String username;
        @Value("${spring.datasource.userdb.password}")
        private String password;
        @Value("${spring.datasource.userdb.driverClassName}")
        private String driverClassName;
        @Value("${spring.datasource.userdb.jdbcUrl}")
        private String jdbcUrl;
        /**
         * 配置一個數據源的bean
         * @return
         */
        @Bean(name = "userdbDataSource")
        public DataSource userdbDataSource() {
            //建立一個XA資料來源
            MysqlXADataSource xaDataSource = new MysqlXADataSource();
            xaDataSource.setUrl(jdbcUrl);
            xaDataSource.setUser(username);
            xaDataSource.setPassword(password);
            AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
            atomikosDataSourceBean.setXaDataSource(xaDataSource);
            atomikosDataSourceBean.setUniqueResourceName("userdbDataSource");
            atomikosDataSourceBean.setMaxPoolSize(30);
            atomikosDataSourceBean.setMinPoolSize(5);
            return atomikosDataSourceBean;
        }
        @Bean(name = "userdbSqlSessionFactory")
        public SqlSessionFactory userdbSqlSessionFactory(@Qualifier("userdbDataSource") DataSource userdbDataSource) throws Exception {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(userdbDataSource);
            return sqlSessionFactoryBean.getObject();
        }
        @Bean(name = "userdbSqlSessionTemplate")
        public SqlSessionTemplate userdbSqlSessionTemplate(@Qualifier("userdbSqlSessionFactory") SqlSessionFactory userdbSqlSessionFactory) {
            return new SqlSessionTemplate(userdbSqlSessionFactory);
        }
    }
    

    使用:然後在具體的serviceimpl方法中新增@Transactional註解即可。