一,读写分离思路:
将不同库的读写操作对应的mapper分别放到不同目录中,例如:
ums/r/
ums/rw/
bap/r/
bap/rw/
二,采用atomikos实现分布式事务:
0,gradle依赖:
compile("org.springframework.boot:spring-boot-starter-jta-atomikos")
1,application.yml配置如下:
#数据源配置
spring:
jta:
enabled: true
service: com.atomikos.icatch.standalone.UserTransactionServiceFactory
max-actives: 200
enable-logging: false
atomikos:
datasource:
dataSourceBap:
unique-resource-name: dataSourceBap
xa-data-source-class-name: oracle.jdbc.xa.client.OracleXADataSource
min-pool-size: 20
max-pool-size: 200
xa-properties:
URL: jdbc:oracle:thin:@172.16.xxx.xxx:1521/bapdb
user: xxx
password: xxx
dataSourceBapRW:
unique-resource-name: dataSourceBapRW
xa-data-source-class-name: oracle.jdbc.xa.client.OracleXADataSource
min-pool-size: 20
max-pool-size: 200
xa-properties:
URL: jdbc:oracle:thin:@172.16.xxx.xxx:1521/bapdb
user: xxx
password: xxx
dataSourceUms:
unique-resource-name: dataSourceUms
xa-data-source-class-name: oracle.jdbc.xa.client.OracleXADataSource
min-pool-size: 20
max-pool-size: 200
xa-properties:
URL: jdbc:oracle:thin:@172.16.xxx.xxx:1521/bapdb
user: xxx
password: xxx
dataSourceUmsRW:
unique-resource-name: dataSourceUmsRW
xa-data-source-class-name: oracle.jdbc.xa.client.OracleXADataSource
min-pool-size: 20
max-pool-size: 200
xa-properties:
URL: jdbc:oracle:thin:@172.16.xxx.xxx:1521/bapdb
user: xxx
password: xxx
log-dir: /home/app/sxpservice/logs/xa/
#mybatis配置
mybatis:
type-aliases-package: ${application.base-package}.domain
configuration:
mapUnderscoreToCamelCase: true
jdbcTypeForNull: VARCHAR
cacheEnabled: false
default-statement-timeout: 5
2,java代码:数据源配置及mybaits配置如下:
// bap读写配置bean【@primary】
@Configuration
@MapperScan(basePackages = "com.xxx.ums.mapper.bap.rw", sqlSessionFactoryRef = "sqlSessionFactoryBapRW")
public class BapRWConfig {
@Primary
@Bean(name = "dataSourceBapRW", destroyMethod = "close")
@ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.dataSourceBapRW")
public DataSource dataSourceBap() {
return new AtomikosDataSourceBean();
}
@Primary
@Bean(name = "sqlSessionFactoryBapRW")
@ConfigurationProperties(prefix = "mybatis")
public SqlSessionFactory sqlSessionFactoryBap(@Qualifier("dataSourceBapRW") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
// bap读配置bean
@Configuration
@MapperScan(basePackages = "com.xxx.ums.mapper.bap.r", sqlSessionFactoryRef = "sqlSessionFactoryBap")
public class BapRConfig {
@Bean(name = "dataSourceBap", destroyMethod = "close")
@ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.dataSourceBap")
public DataSource dataSourceBap() {
return new AtomikosDataSourceBean();
}
@Bean(name = "sqlSessionFactoryBap")
@ConfigurationProperties(prefix = "mybatis")
public SqlSessionFactory sqlSessionFactoryBap(@Qualifier("dataSourceBap") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
// ums读写配置bean
@Configuration
@MapperScan(basePackages = "com.xxx.ums.mapper.ums.rw", sqlSessionFactoryRef = "sqlSessionFactoryUmsRW")
public class UmsRWConfig {
@Bean(name = "dataSourceUmsRW", destroyMethod = "close")
@ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.dataSourceUmsRW")
public DataSource dataSourceUms() {
return new AtomikosDataSourceBean();
}
@Bean(name = "sqlSessionFactoryUmsRW")
@ConfigurationProperties(prefix = "mybatis")
public SqlSessionFactory sqlSessionFactoryUms(@Qualifier("dataSourceUmsRW") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
// ums读配置bean
@Configuration
@MapperScan(basePackages = "com.xxx.ums.mapper.ums.r", sqlSessionFactoryRef = "sqlSessionFactoryUms")
public class UmsRConfig {
@Bean(name = "dataSourceUms", destroyMethod = "close")
@ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.dataSourceUms")
public DataSource dataSourceUms() {
return new AtomikosDataSourceBean();
}
@Bean(name = "sqlSessionFactoryUms")
@ConfigurationProperties(prefix = "mybatis")
public SqlSessionFactory sqlSessionFactoryUms(@Qualifier("dataSourceUms") DataSource dataSource, Environment env) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
3,测试
编写单元测试,使用@transactional注解测试事务
分享到:
相关推荐
本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...
将基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理,通过AOP面向切面实现动态实现数据源的切换 http://www.dczou.com/viemall/407.html
最后,压缩包中的"SpringBoot+Atomikos分布式事务及动态数据源"文件可能包含了具体的代码示例和配置文件,这些资源可以帮助开发者更好地理解和实践上述概念。通过分析和学习这些示例,可以快速上手Spring Boot与...
本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...
Spring Boot、MyBatis 和 Atomikos 的结合提供了一种解决方案,用于处理多数据源的分布式事务管理。以下是对这个主题的详细阐述。 首先,Spring Boot 是一个基于 Spring 框架的轻量级开发工具,它简化了配置过程并...
本文将深入探讨如何利用Spring 4.1.7、Atomikos以及MyBatis实现两阶段的分布式事务(2PC,Two-Phase Commit)。这是一套强大的解决方案,特别适用于处理跨多个数据库或服务的复杂业务逻辑。 首先,我们需要理解什么...
SpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatis
Spring Boot:mybatis-plus + atomikos + druid 实现不同实例数据库的多数据源配置和分布式事务管理(demo项目),想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果...
SpringBoot+Mybatis+Atomikos+Mysql+Oracle 多数据源分布式事物后台搭建 完整demo包,直接下下来解压,数据库配成自己的库,表自己的表,修改下脚本直接跑,网上大把资料,没一个能直接用的,这里花了点时间稍做...
本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...
本项目“springboot+jta+atomikos”旨在利用Spring Boot框架、Java Transaction API (JTA) 和 Atomikos 这一开源事务管理器来实现分布式事务的统一管理。下面将详细阐述这三个关键组件以及它们如何协同工作。 **...
jta Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务 问题一:Druid 和 Mysql 版本的问题 问题二:Springtest 默认情况下事务回滚 Mysql对XA协议支持不好,有待看
使用spring + atomikos+druid配置的分布式事务demo,两种数据源配置方式都可以,使用junit测试没问题,案例中使用的mysql数据库是8.0.11版本,版本不同请自行修改pom.xml和jdbc.properties
本示例"spring+atomikos+druid分布式事务Demo"聚焦于如何在Spring框架中利用Atomikos和Druid来处理分布式事务。接下来,我们将深入探讨这三个组件以及它们在实现分布式事务中的作用。 Spring是一个广泛使用的Java...
本案例主要探讨如何利用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate以及MyBatis,结合MySQL数据库,实现一个跨数据源的分布式事务解决方案。 首先,Spring Boot是一个基于Spring框架的快速开发...
本教程将探讨如何结合Spring和Atomikos来实现分布式事务。 首先,我们需要理解什么是分布式事务。在分布式环境中,事务跨越多个资源管理器,如数据库或消息队列。为了确保ACID(原子性、一致性、隔离性和持久性)...
本项目使用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate和MySQL来实现分布式事务处理和多数据源管理,以确保在多个数据库操作之间保持事务的ACID特性。 首先,Spring Boot作为微服务开发的主流...
本项目"java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip"是一个基于若依(RuoYi)框架改造的多模块分布式事务解决方案,它利用了Atomikos这一强大的分布式事务管理器。以下将详细解析这个项目的知识点...
Atomikos 是一个开源的JTA实现,它为Spring提供了一个轻量级、高性能的分布式事务解决方案。本文将深入探讨如何使用Spring、JTA和Atomikos来实现分布式事务。 首先,了解JTA的基本概念。JTA定义了一套规范,允许在...