SpringBoot2整合多數據源--基於分包結構(二)

SpringBoot-2.2.1.RELEASE版本-整合多數據源-基於分包結構

需求:多數據源配置環境下,如何進行事務管理 ?

根據SpringBoot2整合多數據源--基於分包結構(一),進行修改:

service:

修改成僞代碼:

@Service
public class UserServiceTest {
    @Autowired
    private UserMapperTest userMapperTest;

    @Transactional(transactionManager = "TestTransactionManager")
    public String insertTest(String name, Integer age) {
        userMapperTest.insert(name, age);
        int i = 1 / 0;
        return "success";
    }
}

運行到int i = 1 / 0報錯回滾,數據庫沒有添加數據。

@Transactional(transactionManager = "TestTransactionManager")指明使用哪個事務管理器。

需求:如果同時對兩個數據庫進行操作,怎樣進行事務管理?

分別刪除兩個數據庫連接配置類中該段代碼:

修改兩個數據庫配置類,將其註冊到全局事務管理器中,並註釋掉本地事務管理器(否則會報錯)。

@Bean(name = "TestDataSource")
public DataSource testDataSource(TestConfig testConfig) throws SQLException {
    MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
    mysqlXaDataSource.setUrl(testConfig.getUrl());
    mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
    mysqlXaDataSource.setPassword(testConfig.getPassword());
    mysqlXaDataSource.setUser(testConfig.getUsername());
    mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
    // 註冊到全局事務管理器
    AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
    xaDataSource.setXaDataSource(mysqlXaDataSource);
    xaDataSource.setUniqueResourceName("TestDataSource");

    xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
    xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
    xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
    xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
    xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
    xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
    xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
    xaDataSource.setTestQuery(testConfig.getTestQuery());
    return xaDataSource;
}

 

修改application.yml:

spring:
  datasource:
    test:
     url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
     username: root
     password: 123456
     driver-class-name: com.mysql.jdbc.Driver
     minPoolSize: 3
     maxPoolSize: 25
     maxLifetime: 20000
     borrowConnectionTimeout: 30
     loginTimeout: 30
     maintenanceInterval: 60
     maxIdleTime: 60
     testQuery: select 1
    test1:
     url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
     username: root
     password: 123456
     driver-class-name: com.mysql.jdbc.Driver
     minPoolSize: 3
     maxPoolSize: 25
     maxLifetime: 20000
     borrowConnectionTimeout: 30
     loginTimeout: 30
     maintenanceInterval: 60
     maxIdleTime: 60
     testQuery: select 1

分別添加test、test1數據庫的配置文件連接類: 

package com.ls.springboot.config.test;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "spring.datasource.test")
@Data
public class TestConfig {
   private String url;
   private String username;
   private String password;
   private int minPoolSize;
   private int maxPoolSize;
   private int maxLifetime;
   private int borrowConnectionTimeout;
   private int loginTimeout;
   private int maintenanceInterval;
   private int maxIdleTime;
   private String testQuery;
}

啓動類加載讀取數據庫連接配置類:

@EnableConfigurationProperties({TestConfig.class, Test1Config.class})

修改UserServiceTest:

@Service
public class UserServiceTest {
    @Autowired
    private UserMapperTest userMapperTest;
    @Autowired
    private UserMapperTest1 userMapperTest1;

    @Transactional()
    public String insertTest(String name, Integer age) {
        userMapperTest.insert(name, age);
        int i = 1 / 0;
        userMapperTest1.insert(name, age);
        return "success";
    }
}

此時運行到int i = 1 / 0報錯,回滾,數據庫未添加成功。至此,jta+atomic多數據源事務配置成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章