Heim  >  Artikel  >  Java  >  So verwenden Sie JTA-Komponenten, um die Transaktionsverwaltung mit mehreren Datenquellen in SpringBoot2 zu implementieren

So verwenden Sie JTA-Komponenten, um die Transaktionsverwaltung mit mehreren Datenquellen in SpringBoot2 zu implementieren

王林
王林nach vorne
2023-05-10 22:07:041975Durchsuche

1. Einführung in JTA-Komponenten

1. Grundkonzepte von JTA

JTA ermöglicht es Anwendungen, verteilte Transaktionsverarbeitung durchzuführen ist der Zugriff auf und die Aktualisierung von Daten auf zwei oder mehr Netzwerkcomputerressourcen. Die Unterstützung von JTA durch den JDBC-Treiber verbessert die Datenzugriffsmöglichkeiten erheblich.

Das XA-Protokoll ist eine Reihe verteilter Transaktionsverwaltungsspezifikationen auf Datenbankebene. Mehrere Datenbanken oder Nachrichtenanbieter implementieren die JTA-Schnittstelle Die Schnittstelle kann die JTA-Transaktionsverwaltungsfunktion realisieren.

JTA-Transaktionen sind leistungsfähiger als JDBC-Transaktionen. Eine JTA-Transaktion kann mehrere Teilnehmer haben, während eine JDBC-Transaktion auf eine einzelne Datenbankverbindung beschränkt ist. Jede der folgenden Java-Plattformkomponenten kann an einer JTA-Transaktion teilnehmen XA-Protokoll.

Der Ressourcenmanager ist jede Art von persistentem Datenspeichercontainer, z. B. relationale Datenbanken, die häufig in der Entwicklung verwendet werden: MySQL, Oracle usw., Nachrichten-Middleware RocketMQ, RabbitMQ usw.

Der Transaktionsmanager bietet Transaktionsdeklaration, Transaktionsressourcenverwaltung, Synchronisierung, Transaktionskontextweitergabe und andere Funktionen und ist für die gegenseitige Kommunikation aller Transaktionsteilnehmer in der Einheit verantwortlich. Die JTA-Spezifikation definiert die Schnittstelle für die Interaktion des Transaktionsmanagers mit anderen Transaktionsteilnehmern und für die Interaktion anderer Transaktionsteilnehmer mit dem Transaktionsmanager.

2. SpringBoot-Integration JTA

Gesamtprojektstrukturdiagramm

1. 🎜🎜#
<!--SpringBoot核心依赖-->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!--JTA组件核心依赖-->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-jta-atomikos</artifactid>
</dependency>

2. UmgebungskonfigurationSo verwenden Sie JTA-Komponenten, um die Transaktionsverwaltung mit mehreren Datenquellen in SpringBoot2 zu implementieren

Die Konfiguration von jtaManager ist hier in der Protokollausgabe sehr wichtig.

spring:
  jta:
    transaction-manager-id: jtaManager
  # 数据源配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    data01:
      driverClassName: com.mysql.jdbc.Driver
      dbUrl: jdbc:mysql://localhost:3306/data-one
      username: root
      password: 000000
    data02:
      driverClassName: com.mysql.jdbc.Driver
      dbUrl: jdbc:mysql://localhost:3306/data-two
      username: root
      password: 000000

3. Kerncontainer

Die Konfigurationsmethoden für die beiden Datenbankverbindungen sind hier gleich und Sie können sie im Quellcode herunterladen und lesen. Die Grundidee besteht darin, die Datenquelle zur einheitlichen Verwaltung an die JTA-Komponente zu übergeben, um die Transaktionskommunikation zu erleichtern.

Datenquellenparameter

@Component
@ConfigurationProperties(prefix = "spring.datasource.data01")
public class DruidOneParam {
    private String dbUrl;
    private String username;
    private String password;
    private String driverClassName;
}

JTA-Komponentenkonfiguration

package com.jta.source.conifg;
@Configuration
@MapperScan(basePackages = {"com.jta.source.mapper.one"},sqlSessionTemplateRef = "data01SqlSessionTemplate")
public class DruidOneConfig {
    private static final Logger LOGGER = LoggerFactory.getLogger(DruidOneConfig.class) ;
    @Resource
    private DruidOneParam druidOneParam ;
    @Primary
    @Bean("dataSourceOne")
    public DataSource dataSourceOne () {
        // 设置数据库连接
        MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
        mysqlXADataSource.setUrl(druidOneParam.getDbUrl());
        mysqlXADataSource.setUser(druidOneParam.getUsername());
        mysqlXADataSource.setPassword(druidOneParam.getPassword());
        mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);
        // 事务管理器
        AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
        atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);
        atomikosDataSourceBean.setUniqueResourceName("dataSourceOne");
        return atomikosDataSourceBean;
    }
    @Primary
    @Bean(name = "sqlSessionFactoryOne")
    public SqlSessionFactory sqlSessionFactoryOne(
            @Qualifier("dataSourceOne") DataSource dataSourceOne) throws Exception{
        // 配置Session工厂
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSourceOne);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath*:/dataOneMapper/*.xml"));
        return sessionFactory.getObject();
    }
    @Primary
    @Bean(name = "data01SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("sqlSessionFactoryOne") SqlSessionFactory sqlSessionFactory) {
        // 配置Session模板
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
4, Testvergleich

Hier vergleichen wir die Testergebnisse zweier Methoden. Wenn Sie Datenoperationen zwischen zwei Datenquellen durchführen, müssen Sie der Schnittstellenmethode nur die Annotation @Transactional hinzufügen, um sicherzustellen, dass die Daten konsistent sind auch zwischen Datenquellen gewährleistet sein.

@Service
public class TransferServiceImpl implements TransferService {
    @Resource
    private UserAccount01Mapper userAccount01Mapper ;
    @Resource
    private UserAccount02Mapper userAccount02Mapper ;
    @Override
    public void transfer01() {
        userAccount01Mapper.transfer("jack",100);
        System.out.println("i="+1/0);
        userAccount02Mapper.transfer("tom",100);
    }
    @Transactional
    @Override
    public void transfer02() {
        userAccount01Mapper.transfer("jack",200);
        System.out.println("i="+1/0);
        userAccount02Mapper.transfer("tom",200);
    }
}

Das obige ist der detaillierte Inhalt vonSo verwenden Sie JTA-Komponenten, um die Transaktionsverwaltung mit mehreren Datenquellen in SpringBoot2 zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen