版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。这时候就要管理多数据源事务。

什么是jta:https://www.ibm.com/developerworks/cn/java/j-lo-jta/

pom.xml

注意这里的druid用1.1.9


  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-web</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-test</artifactId>
  12. <scope>test</scope>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.mybatis.spring.boot</groupId>
  16. <artifactId>mybatis-spring-boot-starter</artifactId>
  17. <version>1.1.1</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>mysql</groupId>
  21. <artifactId>mysql-connector-java</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.alibaba</groupId>
  25. <artifactId>druid</artifactId>
  26. <version>1.1.9</version>
  27. </dependency>
  28. <!-- JPA -->
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-data-jpa</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-jta-atomikos</artifactId>
  36. </dependency>

配置第一个数据源


  1. import com.alibaba.druid.pool.xa.DruidXADataSource;
  2. import com.atomikos.icatch.jta.UserTransactionImp;
  3. import com.atomikos.icatch.jta.UserTransactionManager;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.mybatis.spring.SqlSessionFactoryBean;
  6. import org.mybatis.spring.annotation.MapperScan;
  7. import org.springframework.beans.factory.annotation.Qualifier;
  8. import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.context.annotation.Primary;
  12. import org.springframework.transaction.jta.JtaTransactionManager;
  13. import javax.sql.DataSource;
  14. import javax.transaction.UserTransaction;
  15. @Configuration
  16. // // 扫描 Mapper 接口并容器管理
  17. @MapperScan(value ="mapper所在包路径" ,sqlSessionFactoryRef = "moviesSqlSessionFactory")
  18. public class MoviesDataSourceConfig {
  19. @Bean(name = "moviesDataSource")
  20. @Primary
  21. public DataSource masterDataSource() {
  22. DruidXADataSource druidXADataSource = new DruidXADataSource();
  23. druidXADataSource.setUrl("jdbc:mysql://localhost:3306/movies?useUnicode=true&characterEncoding=UTF8&useSSL=false");
  24. druidXADataSource.setUsername("root");
  25. druidXADataSource.setPassword("");
  26. AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
  27. atomikosDataSourceBean.setXaDataSource(druidXADataSource);
  28. atomikosDataSourceBean.setUniqueResourceName("moviesDataSource");
  29. atomikosDataSourceBean.setPoolSize(5);
  30. return atomikosDataSourceBean;
  31. }
  32. /*
  33. * 使用这个来做总事务 后面的数据源就不用设置事务了
  34. * */
  35. @Bean(name = "transactionManager")
  36. @Primary
  37. public JtaTransactionManager regTransactionManager () {
  38. UserTransactionManager userTransactionManager = new UserTransactionManager();
  39. UserTransaction userTransaction = new UserTransactionImp();
  40. return new JtaTransactionManager(userTransaction, userTransactionManager);
  41. }
  42. @Bean(name = "moviesSqlSessionFactory")
  43. @Primary
  44. public SqlSessionFactory masterSqlSessionFactory(@Qualifier("moviesDataSource") DataSource masterDataSource)
  45. throws Exception {
  46. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  47. sessionFactory.setDataSource(masterDataSource);
  48. return sessionFactory.getObject();
  49. }
  50. }

注意:不管有多少个数据源只要配置一个 JtaTransactionManager。

还有 DataSource里用的是DruidXADataSource ,而后注册到AtomikosDataSourceBean并且返回。

配置第二个数据源


  1. import com.alibaba.druid.pool.xa.DruidXADataSource;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import org.mybatis.spring.SqlSessionFactoryBean;
  4. import org.mybatis.spring.annotation.MapperScan;
  5. import org.springframework.beans.factory.annotation.Qualifier;
  6. import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import javax.sql.DataSource;
  10. @Configuration
  11. // // 扫描 Mapper接口
  12. @MapperScan(value ="com.sunsharing.mapper" ,sqlSessionFactoryRef = "teacherSqlSessionFactory")
  13. public class TeacherDataSourceConfig {
  14. @Bean(name = "teacherDataSource")
  15. public DataSource masterDataSource() {
  16. DruidXADataSource druidXADataSource = new DruidXADataSource();
  17. druidXADataSource.setUrl("jdbc:mysql://localhost:3306/reactstu?useUnicode=true&characterEncoding=UTF8&useSSL=false");
  18. druidXADataSource.setUsername("root");
  19. druidXADataSource.setPassword("");
  20. AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
  21. atomikosDataSourceBean.setXaDataSource(druidXADataSource);
  22. atomikosDataSourceBean.setUniqueResourceName("teacherDataSource");
  23. atomikosDataSourceBean.setPoolSize(5);
  24. return atomikosDataSourceBean;
  25. }
  26. @Bean(name = "teacherSqlSessionFactory")
  27. public SqlSessionFactory masterSqlSessionFactory(@Qualifier("teacherDataSource") DataSource masterDataSource)
  28. throws Exception {
  29. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  30. sessionFactory.setDataSource(masterDataSource);
  31. return sessionFactory.getObject();
  32. }
  33. }

这里就不用配置JtaTransactionManager了。

测试:


  1. @Autowired
  2. MoviesMapper moviesMapper;
  3. @Autowired
  4. TeacherMapper teacherMapper;
  5. @RequestMapping(method = RequestMethod.GET)
  6. public MyResponseJson twodata() {
  7. for (int i = 0;i < 5;i++) {
  8. if(i < 2) {
  9. Teacher teacher = new Teacher("3", 10);
  10. teacherMapper.insertteacher(teacher);
  11. Movies movies = new Movies("3", "3", 50, 10);
  12. moviesMapper.insertmovies(movies);
  13. }else {
  14. throw new RuntimeException();
  15. }
  16. }
  17. return new MyResponseJson(200, "成功!", null);
  18. }

测试结果:可以回滚

SpringBoot+JTA+Mybatis的更多相关文章

  1. SpringBoot整合MyBatis

    转载请在文章最上方加上此句话:原文地址:http://www.cnblogs.com/zhuxiaojie/p/5836159.html 前言:这段时间用springboot感觉确实挺好用的,很大程度 ...

  2. spring-boot整合mybatis(1)

    sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...

  3. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  4. Springboot与Mybatis整合

    最近自己用springboot和mybatis做了整合,记录一下: 1.先导入用到的jar包 <dependency> <groupId>org.springframework ...

  5. SpringBoot与Mybatis整合方式01(源码分析)

    前言:入职新公司,SpringBoot和Mybatis都被封装了一次,光用而不知道原理实在受不了,于是开始恶补源码,由于刚开始比较浅,存属娱乐,大神勿喷. 就如网上的流传的SpringBoot与Myb ...

  6. springboot+springmvc+mybatis项目整合

    介绍: 上篇给大家介绍了ssm多模块项目的搭建,在搭建过程中spring整合springmvc和mybatis时会有很多的东西需要我们进行配置,这样不仅浪费了时间,也比较容易出错,由于这样问题的产生, ...

  7. SpringBoot14 SpringBoot整合mybatis

    1 版本说明 springboot:2.0 jdk:1.8 2 创建springBoot项目 创建项目时勾选必要web,MySQL,mybatis相关依赖 创建完成后再pom文件中添加自动部署.lom ...

  8. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  9. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

随机推荐

  1. 【学习笔记】RMQ-Range Minimum/Maximum Query (区间最小/最大值)

    RMQ是一类询问区间最小/最大值的问题. 这类问题一般分成两类:静态区间(无修改),动态区间(带修改). 对于动态区间查询最大/最小,我们显然可以用线段树来解决…… 那么对于静态区间查询最大/最小的问 ...

  2. python学习-48 模块2

    sys修改环境变量 ---------- 只能临时修改 import syssys.path.append() 例如: import sys sys.path.append('C:\Users\hua ...

  3. Python 【模块】

    A 什么是模块 最高级别的程序组织单元(模块什么都能封装) 模块中,我们不但可以直接存放变量,还能存放函数,还能存放类 定义变量需要用赋值语句,封装函数需要用def语句,封装类需要用class语句,但 ...

  4. go struct 的方法1

    方法 Go 没有类.然而,仍然可以在结构体类型上定义方法. 方法接收者 出现在 func 关键字和方法名之间的参数中. package main import (     "fmt" ...

  5. Largest Submatrix 3 CodeForces - 407D (dp,好题)

    大意: 给定矩阵, 求选出一个最大矩形, 满足矩形内每个元素互不相同. 考虑枚举上下左三个边界, 求出最大右边界的位置. 注意到固定上边界, 下边界递推时, 每个左边界对应最大右边界是单调不增的. 所 ...

  6. hdu 1002 prime 模板

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. SpringFramework5.0 @Indexed注解 简单解析

    目录 使用场景 使用方法 原理说明 使用需注意点 案例说明 参考资料 纸上得来终觉浅 绝知此事要躬行 -陆游 最近在看SpringBoot核编程思想(核心篇),看到走向注解驱动编程这章,里面有讲解到: ...

  8. 使用layer.open 父页面获取子页面输入文本框中的值

    $(function () { $("#confirmpassword").click(function () { var pwd = $("#txtPwd") ...

  9. SQL Server 2017 左补齐

    DECLARE @NUM CHAR(3)='7  'SELECT RIGHT('0000000'+CONVERT(VARCHAR(50),1+ RTRIM(@NUM)),7) ​​​​

  10. ztree在onCheck()方法中防止因触发联动关系导致页面多次渲染而卡死的问题

    这几天在项目中遇到了要使用树形选择框, 而且要求比较复杂,具体叙述如下: 首先是有个选择框,左边选择是适用的商品,右边显示已经选择的商品.也就是说,左边每次勾选操作,都要触发一个事件去刷新右边的页面, ...