ホームページ  >  記事  >  Java  >  JTA コンポーネントを使用して SpringBoot2 でマルチデータ ソース トランザクション管理を実装する方法

JTA コンポーネントを使用して SpringBoot2 でマルチデータ ソース トランザクション管理を実装する方法

王林
王林転載
2023-05-10 22:07:041915ブラウズ

1. JTA コンポーネントの紹介

1. JTA の基本概念

JTA は Java-Transaction-API です。JTA を使用すると、アプリケーションは分散トランザクション処理を実行できます。詳細 ネットワーク コンピュータ リソース上のデータにアクセスして更新します。 JDBC ドライバーによる JTA のサポートにより、データ アクセス機能が大幅に強化されます。

XA プロトコルは、データベース レベルの分散トランザクション管理仕様のセットです。JTA は、Java での XA プロトコルの実装です。複数のデータベースまたはメッセージ ベンダーが JTA インターフェイスを実装しています。開発者は SpringJTA を呼び出すだけで済みます。 JTAトランザクション管理機能を実現できるインターフェースです。

JTA トランザクションは、JDBC トランザクションよりも強力です。 JTA トランザクションは複数の参加者を持つことができますが、JDBC トランザクションは単一のデータベース接続に限定されます。次の Java プラットフォーム コンポーネントはいずれも JTA トランザクションに参加できます

2. 分散トランザクション

分散トランザクション (DistributedTransaction) には、トランザクション マネージャー (TransactionManager) と、XA をサポートする 1 つ以上のリソース マネージャーが含まれます。プロトコル。

リソース マネージャーは、開発で一般的に使用されるリレーショナル データベース (MySQL、Oracle など) やメッセージ ミドルウェア RocketMQ、RabbitMQ など、任意のタイプの永続データ ストレージ コンテナーです。

トランザクション マネージャーは、トランザクション宣言、トランザクション リソース管理、同期、トランザクション コンテキストの伝播などの機能を提供し、ユニット内のすべてのトランザクション参加者の相互通信を担当します。 JTA 仕様は、トランザクション マネージャーが他のトランザクション参加者と対話するためのインターフェイス、および他のトランザクション参加者がトランザクション マネージャーと対話するためのインターフェイスを定義します。

2. SpringBoot は JTA を統合します

プロジェクトの全体構造図

JTA コンポーネントを使用して SpringBoot2 でマルチデータ ソース トランザクション管理を実装する方法

##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.環境構成

ここでの jtaManager の構成は、ログ出力において非常に重要です。

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. コア コンテナ

ここでの 2 つのデータベース接続の構成方法は同じであり、ダウンロードしてソース コードで読み取ることができます。基本的な考え方は、データ ソースを JTA コンポーネントに渡して統合管理を行い、トランザクション通信を容易にすることです。

データ ソース パラメーター

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

JTA コンポーネント構成

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. テストの比較

ここに渡されます2 つのメソッドのテスト結果を比較します。2 つのデータ ソース間でデータ操作を実行する場合、インターフェイス メソッドに @Transactional アノテーションを追加するだけで済みます。これにより、2 つのデータ ソース間でデータの一貫性が保証されます。

rree

以上がJTA コンポーネントを使用して SpringBoot2 でマルチデータ ソース トランザクション管理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。