springboot + 드루이드 + MyBatis로 + mysql을 + 멀티 소스 데이터 트랜잭션 관리
자바 분산 트랜잭션 솔루션은 JTA (즉, 자바 트랜잭션 API)이며, springboot 관계자는 Atomikos 또는 솔루션 Bitronix의를 제공, 사실, 많은 기업들은 대부분의 경우 분산 트랜잭션을 구현하는 메시지 큐 방법입니다. 여기가 Atomikos 간단한 트랜잭션 관리를 공유 할 수 있습니다.
프로젝트 종속성
springboot의 pom.xml는이 의존 관계를 첨가 atomikos :
<!--分布式事务管理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--这里最好要5.1.47之后的版本-->
<version>5.1.47</version>
</dependency>
프로파일 데이터베이스 관련 정보가있는 application.properties :
#数据库1
spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.druid.one.username=root
spring.datasource.druid.one.password=123456
#数据库2
spring.datasource.druid.two.url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.druid.two.username=root
spring.datasource.druid.two.password=123456
자바 구성은 두 개의 데이터베이스에 위의 정보를 읽고, 두 가지 범주를 만듭니다
@ConfigurationProperties(prefix = "spring.datasource.druid.one")
public class DsOneProperties {
private String username;
private String password;
private String url;
//这里省掉Set和get方法
}
@ConfigurationProperties(prefix = "spring.datasource.druid.two")
public class DsTwoProperties {
private String username;
private String password;
private String url;
//这里省掉Set和get方法
}
SpringBoot에서 프로젝트를 시작할 때,이 정보를로드 주석과 함께 수업을 시작
@EnableConfigurationProperties(value = {DsOneProperties.class, DsTwoProperties.class})
마스터 데이터베이스 구성 클래스 MyBatisConfigOne 만들기 :
@Configuration//声明该类是一个配置类
@MapperScan(basePackages = "com.lwh.mybatistest.mapper", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
//扫描的包是com.lwh.mybatistest.mapper
public class MyBatisConfigOne {
// 配置主数据源
@Primary
@Bean
public DataSource dsOne(DsOneProperties dsOneProperties) throws SQLException {
//配置XA协议数据源,从配置文件中读取相应属性
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(dsOneProperties.getUrl());
mysqlXaDataSource.setPassword(dsOneProperties.getPassword());
mysqlXaDataSource.setUser(dsOneProperties.getUsername());
//将本地事务注册到Atomikos全局事务
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("dsOne");
return xaDataSource;
}
@Primary
@Bean(name = "sqlSessionFactory1")
public SqlSessionFactory SqlSessionFactory1(@Qualifier("dsOne") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Primary
@Bean(name = "sqlSessionTemplate1")
public SqlSessionTemplate SqlSessionTemplate1(
@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
구성 데이터베이스 범주에서 작성된 상기 구성 데이터베이스 마스터 클래스에 따르면 :
@Configuration
@MapperScan(basePackages = "com.lwh.mybatistest.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
@Bean
public DataSource dsTwo(DsTwoProperties dsTwoProperties) throws SQLException {
//配置从数据源
//配置XA协议数据源,从配置文件中读取相应属性
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(dsTwoProperties.getUrl());
mysqlXaDataSource.setPassword(dsTwoProperties.getPassword());
mysqlXaDataSource.setUser(dsTwoProperties.getUsername());
//将本地事务注册到Atomikos全局事务
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("dsTwo");
return xaDataSource;
}
@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory SqlSessionFactory2(@Qualifier("dsTwo") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "sqlSessionTemplate2")
public SqlSessionTemplate SqlSessionTemplate2(
@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
간단한 컨트롤러 테스트 클래스를 만듭니다
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
BookService bookService;
@Autowired
BookService2 bookService2;
@GetMapping("/add1")
@Transactional
public String addBook() {
Book book = new Book();
book.setBookname("测试");
book.setAuthor("test:01");
System.out.println("数据库1:>>>>");
bookService.addBook(book);
System.out.println("数据库2:>>>>");
bookService2.addBook(book);
return "测试add1操作成功!";
}
@GetMapping("/add2")
@Transactional
public String addBook2() {
Book book = new Book();
book.setBookname("测试add2");
book.setAuthor("test:01");
System.out.println("数据库1:>>>>");
bookService.addBook(book);
int a = 10 / 0;
System.out.println("数据库2:>>>>");
bookService2.addBook(book);
return "测试add2操作成功!";
}
}
서비스 클래스는 매퍼 전화 간단한 삽입 방법이다 :
@Service
public class BookService {
@Autowired
BookMapper bookMapper;
public void addBook(Book book) {
bookMapper.insertSelective(book);
}
}
기본 트랜잭션 관리자가 springboot, 그래서 구성, 당신은 기본을 사용할 수 있습니다 당신은 특별한 요구가있는 경우, 당신은 당신의 자신의 트랜잭션 관리자 자체를 만들 수 없다.
간단한 atomikos 완료 구성에 연결, 구성 정보는 비교적 간단하다, 학생들이 깊이 연구하고자하는, 당신은 공식 문서를 참조 할 수 있습니다.