1、导入相应的jar包依赖

<!-- 集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <!-- 分布式事务管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

2、配置多数据源

  2.1 在application.xml中配置多数据源的连接

spring:
datasource:
test1:
url: jdbc:mysql://localhost:3306/test
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
testQuery: select
test2:
url: jdbc:mysql://localhost:3306/test1
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
testQuery: select
mybatis:
mapper-locations: classpath:mapping/*.xml

  2.2 创建多数据库的连接信息配置类

@ConfigurationProperties(prefix="spring.datasource.test1")
@Primary
public class DB1Config { private String url; private String username; private String password; private String testQuery; public String getUrl() {
return url;
}

  ...添加get和set方法,如果多个数据源要配置多个
}

  2.3 创建多数据源的配置类,将不同的数据源交给jta的atomikos进行统一管理(多个数据源配置多个这样的文件)

@Configuration//注册到spring boot容器中
@MapperScan(basePackages="com.beifeng.hadoop.spring.boot.dao.jta.test1",sqlSessionFactoryRef="jtaTest1SqlSessionFactory")
public class JtaDataSource1Config { @Bean(name="jtaTest1DataSource")
@Primary//一个项目中只指定一个数据源为主数据源
public DataSource testDataSource(DB1Config db1Config){
MysqlXADataSource dataSource=new MysqlXADataSource();
dataSource.setUrl(db1Config.getUrl());
dataSource.setUser(db1Config.getUsername());
dataSource.setPassword(db1Config.getPassword());
dataSource.setPinGlobalTxToPhysicalConnection(true);
//将该数据源叫个atomikos进行统一管理
AtomikosDataSourceBean atomikosDataSource=new AtomikosDataSourceBean();
atomikosDataSource.setXaDataSource(dataSource);
atomikosDataSource.setUniqueResourceName("jtaTest1DataSource");
atomikosDataSource.setTestQuery(db1Config.getTestQuery());
return atomikosDataSource;
} @Bean(name="jtaTest1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("jtaTest1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
} @Bean(name="jtaTest1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("jtaTest1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

  2.4 在service中进行声明式事务配置

@Service
public class Test1JtaUserService { @Autowired//引入不同的数据源
private JtaUser1Dao jtaUser1Dao; @Autowired
private JtaUser2Dao jtaUser2Dao; @Transactional//声明式事务
public void insertJtaUser(String name,Integer age) {
jtaUser1Dao.insertUser(name, age);
jtaUser2Dao.insertUser(name, age);
int a=1/0;//如果出现异常,分布式事务会同时回滚
} }

  2.5 在启动类中声明多数据源的配置

@SpringBootApplication
@MapperScan("com.beifeng.hadoop.spring.boot.dao")//指定mybatis的dao扫包路径
@EnableConfigurationProperties(value={DB1Config.class,DB2Config.class})//指定多数据源的配置
public class App { public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

3 aop切面编程

@Aspect
@Component
public class WebLogAspect { private Logger logger=LoggerFactory.getLogger(WebLogAspect.class); private Long startTime; @Pointcut("execution(public * com.beifeng.hadoop.spring.boot.controller..*.*(..))")
public void webLog() { } @Before("webLog()")
public void doBefore(JoinPoint joinPoint) {
logger.info("==============开始请求=============");
startTime=System.currentTimeMillis();
//接收到请求,记录请求内容
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest httpServletRequest=requestAttributes.getRequest();
logger.info("url: "+httpServletRequest.getRequestURL());
logger.info("http_method: "+httpServletRequest.getMethod());
logger.info("ip "+httpServletRequest.getRemoteAddr());
Enumeration<String> parameterNames = httpServletRequest.getParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = (String) parameterNames.nextElement();
logger.info("parameter:{}->{}",parameterName,httpServletRequest.getParameter(parameterName));
}
} @AfterReturning(returning="ret",pointcut="webLog()")
public void doAfterReturning(Object ret) {
//处理完请求,返回内容
logger.info("响应结果:"+ret);
logger.info("==============开始结束,耗时"+(System.currentTimeMillis()-startTime)+"毫秒============="); }
}

springboot多数据库及分布式事务配置的更多相关文章

  1. 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)

    本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...

  2. 【转】PostgreSQL分布式事务配置

    XA是open group提出的分布式事务处理规范,JTA支持XA规范,JTA只规定了接口,有些应用容器提供实现,也有一些三方的开源实现可用,比如Atomikos. 如果PostgreSQL参与分布式 ...

  3. Springboot整合RocketMQ解决分布式事务

    直接上代码: 代码结构如下: 依次贴出相关类: DataSource1Config: package com.example.demo.config;import org.apache.ibatis. ...

  4. 测试web数据库的分布式事务atomikos 的三种数据源 SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSourceBean

    这2天学习了atomikos事务控制框架,其中看到有3种数据源,分别是,SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSou ...

  5. springboot学习笔记:10.springboot+atomikos+mysql+mybatis+druid+分布式事务

    前言 上一篇文章我们整合了springboot+druid+mybatis+mysql+多数据源: 本篇文章大家主要跟随你们涛兄在上一届基础上配置一下多数据源情况下的分布式事务: 首先,到底啥是分布式 ...

  6. 巨杉数据库SequoiaDB】巨杉Tech | SequoiaDB 分布式事务实现原理简介

    1 分布式事务背景 随着分布式数据库技术的发展越来越成熟,业内对于分布式数据库的要求也由曾经只用满足解决海量数据的存储和读取这类边缘业务向核心交易业务转变.分布式数据库如果要满足核心账务类交易需求,则 ...

  7. MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  8. DTP模型之一:(XA协议之三)MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  9. 数据库分布式事务XA规范介绍及Mysql底层实现机制

    1. 引言 分布式事务主要应用领域主要体现在数据库领域.微服务应用领域.微服务应用领域一般是柔性事务,不完全满足ACID特性,特别是I隔离性,比如说saga不满足隔离性,主要是通过根据分支事务执行成功 ...

随机推荐

  1. centos 7 设置开机启动脚本

    vi /etc/rc.d/rc.local 在末尾追加 sh脚本 sh脚本要提前赋予执行权限 下面是测试,开机同步北京时间 [root@commonTest bin]# vi /usr/local/b ...

  2. String类可以被继承吗?我们来聊聊final关键字!

    String类可以被继承吗?我们来聊聊final关键字! String在java基础知识中绝对是个重点知识,关于String的一些问题也是非常的多,而且牵涉到内存等高级知识,在面试中也是经常被考察的一 ...

  3. Hadoop本地环境安装

    一.服务器环境 本人用的是阿里云的ECS的入门机器,配置1核2G,1M带宽,搭了个Hadoop单机环境,供参考 Linux发行版本:Centos7 JDK:阿里云镜像市场中选择JDK8 二.安装步骤 ...

  4. aiohttp上报:Got more than 8190 bytes (10160) when reading Status line is too long.错误的解决办法

    通过浏览器向web服务传递base64码的图片时遇到参数过长的问题? 解决办法:查看aiohttp的源码:aiohttp/http_parser.py下找到: class HeadersParser: ...

  5. 【转】优秀的Vue UI组件库

    原文来源:https://www.leixuesong.com/3342 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司 ...

  6. 2018-2-13-win10-uwp-HttpClient-post错误

    title author date CreateTime categories win10 uwp HttpClient post错误 lindexi 2018-2-13 17:23:3 +0800 ...

  7. exp ORA-01455: converting column overflows integer datatype

    EXP-00008: ORACLE error 1455 encounteredORA-01455: converting column overflows integer datatype add ...

  8. 二、JPA的注解

    @Entity注类就表示实体类了.注意:必须要有@Entity注解,否则会报错. @Table里面的就是表名和类名进行映射. @Id标识主键列,@GeneratedValue主键生成策略配合@Id使用 ...

  9. swap的几点理解

    一.什么是swap space(交换分区)? 在Linux系统中,当物理内存满了才使用Swap空间.当系统需要更多的内存资源,并且物理内存已经满了,此时,内存中那些不活跃的pages被移动(move) ...

  10. java web项目获取项目路径

    注意:有时获取到的项目路径后再+“自定义路径后” 路径不可用,这时要看下项目里自定义路径是不是空文件夹,如果是空文件夹则调试和运行时文件夹不会编译到部署文件里. 1.方法一 调试时只能获取eclips ...