SpringBoot 2 는 JTA 구성 요 소 를 통합 하여 다 중 데이터 소스 사무 관 리 를 실현 합 니 다.

1.JTA 구성 요소 안내
1.JTA 기본 개념
JTA 는 자바-transaction-API 이 고 JTA 는 응용 프로그램 이 분포 식 사무 처 리 를 수행 할 수 있 도록 합 니 다.즉,두 개 이상 의 네트워크 컴퓨터 자원 에 접근 하고 데 이 터 를 업데이트 할 수 있 습 니 다.JDBC 드라이버 가 JTA 에 대한 지원 은 데이터 접근 능력 을 크게 향상 시 켰 다.
XA 프로 토 콜 은 데이터베이스 차원 의 분포 식 사무 관리의 규범 이다.JTA 는 XA 프로 토 콜 이 자바 에서 실현 되 고 여러 개의 데이터베이스 나 메시지 업 체 가 JTA 인 터 페 이 스 를 실현 하 며 개발 자 는 SpringJTA 인 터 페 이 스 를 호출 하면 JTA 사무 관리 기능 을 실현 할 수 있다.
JTA 사 무 는 JDBC 사무 보다 더 강하 다.하나의 JTA 사 무 는 여러 명의 참여 자가 있 을 수 있 으 며,하나의 JDBC 사 무 는 하나의 데이터베이스 연결 로 제한 된다.다음 자바 플랫폼 의 모든 구성 요 소 는 JTA 업무 에 참여 할 수 있 습 니 다.
2.분포 식 사무
분산 트 랜 잭 션(Distributed Transaction)은 트 랜 잭 션 관리자(TransactionManager)와 하나 이상 의 XA 프로 토 콜 을 지원 하 는 자원 관리자(Resource Manager)를 포함한다.
자원 관리 자 는 개발 에 자주 사용 되 는 관계 형 데이터 베이스:MySQL,Oracle 등,메시지 미들웨어 RocketMQ,RabbitMQ 등 임의의 유형의 지구 화 데이터 저장 용기 입 니 다.
사무 관리 자 는 사무 성명,사무 자원 관리,동기 화,사무 상하 문 전파 등 기능 을 제공 하고 모든 사무 참여 단원 의 상호 통신 에 대한 책임 을 진다.JTA 규범 은 사무 관리자 와 다른 사무 참여 자가 상호작용 하 는 인 터 페 이 스 를 정의 하고 다른 사무 참여 자 와 사무 관리 자 는 상호작용 을 한다.
2.SpringBoot 통합 JTA
프로젝트 전체 구성 도

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.핵심 용기
여기 서 두 데이터 베 이 스 를 연결 하 는 설정 기법 은 모두 같 아서 소스 코드 에서 스스로 다운로드 하여 읽 을 수 있다.기본 적 인 사 고 는 데이터 원본 을 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.테스트 대비
여기 서 두 가지 방법 으로 테스트 결 과 를 비교 하여 두 데이터 소스 간 에 데이터 조작 을 할 때 인터페이스 방법 에@Transactional 주 해 를 추가 하면 데이터 가 두 데이터 소스 간 에 도 일치 성 을 확보 할 수 있 습 니 다.

@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);
  }
}

3.JTA 구성 요소 소결
위 에서 JTA 는 다 중 데이터 소스 의 사무 관 리 를 실현 하고 사용 방식 이 상대 적 으로 간단 하 며 두 단계 의 제출 을 통 해 여러 데이터 소스 의 사 무 를 동시에 관리 할 수 있 습 니 다.그러나 드 러 난 문제 도 매우 뚜렷 하 다.바로 비교적 심각 한 성능 문제 이다.여러 개의 데이터 소스 를 동시에 조작 하기 때문에 그 중의 한 데이터 소스 가 데 이 터 를 얻 는 시간 이 너무 길 면 전체 요청 이 매우 길 고 업무 시간 이 너무 길 며 데 이 터 를 잠 그 는 시간 이 너무 길 기 때문에 자 연 스 럽 게 저 성능 과 저 스루풋 을 초래 할 수 있다.
따라서 실제 개발 과정 에서 성능 에 대한 요구 가 높 은 시스템 은 JTA 구성 요 소 를 사용 하여 사무 관 리 를 하 는 경우 가 드물다.경량급 분포 식 사무 해결 방안 으로서 작은 시스템 에서 도 추천 할 만하 다.
마지막 으로 자바 의 API 로 서 원리 와 용법 은 배 워 서 시야 와 방향 을 넓 힐 필요 가 있다.
소스 코드 주소
GitHub/주소
https://github.com/cicadasmile/middle-ware-parent
GitEE/주소
https://gitee.com/cicadasmile/middle-ware-parent
SpringBoot 2 가 JTA 구성 요 소 를 통합 하여 다 중 데이터 소스 트 랜 잭 션 관 리 를 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 SpringBoot 2 JTA 다 중 데이터 소스 트 랜 잭 션 관리 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기