SpringBoot+JTA+Mybatis
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。这时候就要管理多数据源事务。
什么是jta:https://www.ibm.com/developerworks/cn/java/j-lo-jta/
pom.xml
注意这里的druid用1.1.9
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-test</artifactId>
-
<scope>test</scope>
-
</dependency>
-
<dependency>
-
<groupId>org.mybatis.spring.boot</groupId>
-
<artifactId>mybatis-spring-boot-starter</artifactId>
-
<version>1.1.1</version>
-
</dependency>
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>com.alibaba</groupId>
-
<artifactId>druid</artifactId>
-
<version>1.1.9</version>
-
</dependency>
-
<!-- JPA -->
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-data-jpa</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
-
</dependency>
配置第一个数据源
-
import com.alibaba.druid.pool.xa.DruidXADataSource;
-
import com.atomikos.icatch.jta.UserTransactionImp;
-
import com.atomikos.icatch.jta.UserTransactionManager;
-
import org.apache.ibatis.session.SqlSessionFactory;
-
import org.mybatis.spring.SqlSessionFactoryBean;
-
import org.mybatis.spring.annotation.MapperScan;
-
import org.springframework.beans.factory.annotation.Qualifier;
-
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import org.springframework.context.annotation.Primary;
-
import org.springframework.transaction.jta.JtaTransactionManager;
-
import javax.sql.DataSource;
-
import javax.transaction.UserTransaction;
-
-
-
@Configuration
-
// // 扫描 Mapper 接口并容器管理
-
@MapperScan(value ="mapper所在包路径" ,sqlSessionFactoryRef = "moviesSqlSessionFactory")
-
public class MoviesDataSourceConfig {
-
-
-
@Bean(name = "moviesDataSource")
-
@Primary
-
public DataSource masterDataSource() {
-
DruidXADataSource druidXADataSource = new DruidXADataSource();
-
druidXADataSource.setUrl("jdbc:mysql://localhost:3306/movies?useUnicode=true&characterEncoding=UTF8&useSSL=false");
-
druidXADataSource.setUsername("root");
-
druidXADataSource.setPassword("");
-
-
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
-
atomikosDataSourceBean.setXaDataSource(druidXADataSource);
-
atomikosDataSourceBean.setUniqueResourceName("moviesDataSource");
-
atomikosDataSourceBean.setPoolSize(5);
-
-
return atomikosDataSourceBean;
-
}
-
-
/*
-
* 使用这个来做总事务 后面的数据源就不用设置事务了
-
* */
-
@Bean(name = "transactionManager")
-
@Primary
-
public JtaTransactionManager regTransactionManager () {
-
UserTransactionManager userTransactionManager = new UserTransactionManager();
-
UserTransaction userTransaction = new UserTransactionImp();
-
return new JtaTransactionManager(userTransaction, userTransactionManager);
-
}
-
-
@Bean(name = "moviesSqlSessionFactory")
-
@Primary
-
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("moviesDataSource") DataSource masterDataSource)
-
throws Exception {
-
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
-
sessionFactory.setDataSource(masterDataSource);
-
return sessionFactory.getObject();
-
}
-
-
-
-
}
注意:不管有多少个数据源只要配置一个 JtaTransactionManager。
还有 DataSource里用的是DruidXADataSource ,而后注册到AtomikosDataSourceBean并且返回。
配置第二个数据源
-
import com.alibaba.druid.pool.xa.DruidXADataSource;
-
-
import org.apache.ibatis.session.SqlSessionFactory;
-
import org.mybatis.spring.SqlSessionFactoryBean;
-
import org.mybatis.spring.annotation.MapperScan;
-
import org.springframework.beans.factory.annotation.Qualifier;
-
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
-
import javax.sql.DataSource;
-
-
@Configuration
-
// // 扫描 Mapper接口
-
@MapperScan(value ="com.sunsharing.mapper" ,sqlSessionFactoryRef = "teacherSqlSessionFactory")
-
public class TeacherDataSourceConfig {
-
-
-
@Bean(name = "teacherDataSource")
-
public DataSource masterDataSource() {
-
DruidXADataSource druidXADataSource = new DruidXADataSource();
-
druidXADataSource.setUrl("jdbc:mysql://localhost:3306/reactstu?useUnicode=true&characterEncoding=UTF8&useSSL=false");
-
druidXADataSource.setUsername("root");
-
druidXADataSource.setPassword("");
-
-
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
-
atomikosDataSourceBean.setXaDataSource(druidXADataSource);
-
atomikosDataSourceBean.setUniqueResourceName("teacherDataSource");
-
atomikosDataSourceBean.setPoolSize(5);
-
return atomikosDataSourceBean;
-
}
-
-
-
@Bean(name = "teacherSqlSessionFactory")
-
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("teacherDataSource") DataSource masterDataSource)
-
throws Exception {
-
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
-
sessionFactory.setDataSource(masterDataSource);
-
return sessionFactory.getObject();
-
}
-
-
}
这里就不用配置JtaTransactionManager了。
测试:
-
@Autowired
-
MoviesMapper moviesMapper;
-
-
@Autowired
-
TeacherMapper teacherMapper;
-
-
-
@RequestMapping(method = RequestMethod.GET)
-
public MyResponseJson twodata() {
-
for (int i = 0;i < 5;i++) {
-
if(i < 2) {
-
Teacher teacher = new Teacher("3", 10);
-
teacherMapper.insertteacher(teacher);
-
Movies movies = new Movies("3", "3", 50, 10);
-
moviesMapper.insertmovies(movies);
-
-
}else {
-
throw new RuntimeException();
-
}
-
}
-
return new MyResponseJson(200, "成功!", null);
-
}
测试结果:可以回滚
SpringBoot+JTA+Mybatis的更多相关文章
- SpringBoot整合MyBatis
转载请在文章最上方加上此句话:原文地址:http://www.cnblogs.com/zhuxiaojie/p/5836159.html 前言:这段时间用springboot感觉确实挺好用的,很大程度 ...
- spring-boot整合mybatis(1)
sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- Springboot与Mybatis整合
最近自己用springboot和mybatis做了整合,记录一下: 1.先导入用到的jar包 <dependency> <groupId>org.springframework ...
- SpringBoot与Mybatis整合方式01(源码分析)
前言:入职新公司,SpringBoot和Mybatis都被封装了一次,光用而不知道原理实在受不了,于是开始恶补源码,由于刚开始比较浅,存属娱乐,大神勿喷. 就如网上的流传的SpringBoot与Myb ...
- springboot+springmvc+mybatis项目整合
介绍: 上篇给大家介绍了ssm多模块项目的搭建,在搭建过程中spring整合springmvc和mybatis时会有很多的东西需要我们进行配置,这样不仅浪费了时间,也比较容易出错,由于这样问题的产生, ...
- SpringBoot14 SpringBoot整合mybatis
1 版本说明 springboot:2.0 jdk:1.8 2 创建springBoot项目 创建项目时勾选必要web,MySQL,mybatis相关依赖 创建完成后再pom文件中添加自动部署.lom ...
- springboot集成mybatis(二)
上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...
- springboot集成mybatis(一)
MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...
随机推荐
- Word 查找替换高级玩法系列之 -- 给数字批量添加空格和下划线
Word中的查找和替换是一个很强大的功能,很多人都在使用这项功能.查找和替换,顾名思义就是说,查找到符合条件的内容,然后将那些内容替换成我们所需要的内容.下面,我们就通过实例来了解一下查找和替换功能, ...
- LayUI笔记
LayUI 经典模块化前端框架,低门槛开箱即用的前端 UI 解决方案. 其他UI框架: Bootstrap,Element, EasyUI,LayUI 等等 LayUI使用 Layui ...
- MySQL的sql语言分类DML、DQL、DDL、DCL
SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data Definition Language) 对象: 数据库和表 ...
- python中append、extend、和insert的区别
a_list = [x for x in range(1, 11)] print(a_list) a_list.append('sdadfewf') # 将整个字符串放到列表的最后 print(a_l ...
- TZOJ2882: 美食节之感恩父母
#include<stdio.h> int main() { ],b[],i,j,max,m,t1,t2,t3; while(scanf("%d",&m),m) ...
- MongoDB进阶之路:不仅仅是技术研究,还有优化和最佳实践--转载
摘要:MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. 本文将从操作手册.技术研究.会议分享.场景应用等几个方面给大家推荐干货好文 ...
- 【5号课堂】scratch制作电子生日贺卡
贺卡在我国的使用由来已久,在古代,上层士大夫有用名帖互相问候的习俗 唐宋以后,贺卡的名称及功能有所进步,称为”门状“或“飞帖“,到了明清,又叫“红单“.“贺年帖“等等,听着名字就知功能越来越世俗化,文 ...
- vuex 理解
为什么要用vuex?页面由多个视图组成,用户操作会引视图的状态变化. 多个视图依赖于同一状态(例如:菜单导航) 来自不同视图的行为需要变更同一状态(例如:评论弹幕) vuex 的作用 为vue.js开 ...
- (二十一)SpringBoot之集成mybatis:使用mybatis xml
一.引入maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...
- C#基础--Virtual与abstract区别、重写
Virtual作用:子类可以对父类重写,虚方法是对多态特征体现.代表一类对象的所具有的公共属性或方法. public class Animal { public string Name { get; ...