SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.
用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER 扫描有问题,只能说之前整合MYBATIS 的方式不对.
这次的整合应该是不存在加载顺序引起的问题,使用了一段时间,妥妥的,记录下来
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
application.yml,支持多个数据源,有多少就写多少个,但这是静态的多数据源方式,也可以动态往Spring的数据源路由里面丢
spring:
datasource:
# readSize: 1
# name: writeDataSource
type: com.alibaba.druid.pool.DruidDataSource
write:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=true
username: root
password: 123
initialSize: 10
maxActive: 100
maxWait: 60000
minIdle: 5
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
DataSourceConfig.java
/**
* Created by ZhenWeiLai on 2016/11/20.
*/
@Configuration
@EnableTransactionManagement
@MapperScan("com.lzw.**.dao")//mybatis扫描
public class DataSourceConfig implements TransactionManagementConfigurer {
@Value("${spring.datasource.type}")
private Class<? extends DataSource> dataSourceType; @Primary
@Bean(name = "writeDataSource")
@ConfigurationProperties(prefix = "spring.datasource.write")
public DataSource writeDataSource() {
return DataSourceBuilder.create().type(dataSourceType).build();
} /**
* 有多少个从库就要配置多少个
* @return
*/
// @Bean(name = "readDataSource")
// @ConfigurationProperties(prefix = "spring.datasource.read")
// public DataSource readDataSourceOne() {
// return DataSourceBuilder.create().type(dataSourceType).build();
// } /**
* AbstractRoutingDataSource 这破玩意 继承了AbstractDataSource ,AbstractDataSource又实现了DataSource
* 所以可以直接丢去构建 SqlSessionFactory
* @return
*/
@Bean("routingDataSource")
// @Bean(name="routingDataSource",initMethod = "init",destroyMethod = "close")
public MyRoutingDataSource dataSourceProxy(){
// int size = Integer.parseInt(dataSourceSize);
MyRoutingDataSource proxy = new MyRoutingDataSource();
Map<Object,Object> dataSourceMap = new HashMap<>();
DataSource writeSource = writeDataSource();
// DataSource readSource = getReadDataSource(); dataSourceMap.put(TargetDataSource.WRITE.getCode(),writeSource);
// dataSourceMap.put(TargetDataSource.READ.getCode(),readSource); proxy.setDefaultTargetDataSource(dataSourceMap.get(TargetDataSource.WRITE.getCode()));
proxy.setTargetDataSources(dataSourceMap);
return proxy;
} @Bean
public SqlSessionFactory sqlSessionFactory() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSourceProxy());
bean.setTypeAliasesPackage("com.lzw");
bean.setVfs(SpringBootVFS.class);
//添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath:**/mapper/**/*.xml"));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} /**
* 事务配置,考虑多数据源情况下
* @return
*/
@Bean
public PlatformTransactionManager txManager() {
return new DataSourceTransactionManager(dataSourceProxy());
} @Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return txManager();
} }
MyRoutingDataSource.java
/**
* Created by ZhenWeiLai on 2016/11/22.
*/
public class MyRoutingDataSource extends AbstractRoutingDataSource {
/**
* 这里可以做简单负载均衡,暂时用不上
*/
// private int dataSourceOrder;
// private AtomicInteger count = new AtomicInteger(0);
public MyRoutingDataSource() {
} // public MyRoutingDataSource(int _dataSourceOrder){
// this.dataSourceOrder = _dataSourceOrder;
// } /**
* 这个方法会根据返回的key去配置文件查找数据源
*
* @return
*/
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getTargetDataSource();
}
}
TargetDataSource.java
/**
* Created by ZhenWeiLai on 2016/11/22.
* 配置读写分离或者多数据源
*/
public enum TargetDataSource { WRITE("write","主库"), READ("read","从库"), CREATE("create","建库"); final private String code; final private String name; TargetDataSource(String _code,String _name) {
this.code = _code;
this.name = _name;
} public String getCode() {
return code;
} public String getName(){
return name;
} public static String getNameByCode(String _code){
for(TargetDataSource item : TargetDataSource.values()){
if(item.getCode().equals(_code)){
return item.getName();
}
}
return "";
}
}
喜欢的话,可以使用AOP 注解切换数据源,但是要注意滥用AOP,加上全局统一AOP异常拦截,以及Spring AOP事务,顺序问题,处理不好可能会引起事务失效,或者异常拦截失效,也可能是数据源切换失效.
AOP事务如果先开启了,那么AOP切换数据源将无效
/**
* Created by ZhenWeiLai on 2016/11/22.
* 切换数据源的注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSourceSwitch {
String targetDataSource() default "";
}
DataSourceContextHolder.java
/**
* Created by ZhenWeiLai on 2016/11/22.
* 多数据源/读写分离
*/
public class DataSourceContextHolder {
private static final ThreadLocal<String> dataSourceLocal = new ThreadLocal<>(); public static ThreadLocal<String> getDataSourceLocal() {
return dataSourceLocal;
} /**
* 从库 可以有多个
*/
public static void read() {
dataSourceLocal.set(TargetDataSource.READ.getCode());
} /**
* 主库 只有一个
*/
public static void write() {
dataSourceLocal.set(TargetDataSource.WRITE.getCode());
} public static String getTargetDataSource() {
return dataSourceLocal.get();
}
}
SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.的更多相关文章
- SpringBoot整合Mybatis多数据源 (AOP+注解)
SpringBoot整合Mybatis多数据源 (AOP+注解) 1.pom.xml文件(开发用的JDK 10) <?xml version="1.0" encoding=& ...
- 三、SpringBoot 整合mybatis 多数据源以及分库分表
前言 说实话,这章本来不打算讲的,因为配置多数据源的网上有很多类似的教程.但是最近因为项目要用到分库分表,所以让我研究一下看怎么实现.我想着上一篇博客讲了多环境的配置,不同的环境调用不同的数据库,那接 ...
- SpringBoot整合mybatis多数据源,支持分布式事务
编码工具:IDEA SpringBoot版本:2.0.1 JDK版本:1.8 1.使用IDEA构建一个Maven工程 ,添加依赖: <?xml version="1.0" e ...
- spring-boot整合Mybatis多数据源案例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...
- SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)
1.概念:SpringBoot 整合 MyBatis 2.背景 SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少数据层操作,所有的开发 ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- springboot整合mybatis的时候报错Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
今天闲来无事,学习springboot整合mybatis,在bilibili看视频学的,视频中在dao层的interface上面加上org.apache.ibatis.annotations.Mapp ...
- SpringBoot整合Mybatis,并实现事务控制
SpringBoot整合Mybatis,并实现事务控制 1. 在pom文件里添加相关maven文件 <parent> <groupId>org.springframework. ...
- Java开发学习(三十九)----SpringBoot整合mybatis
一.回顾Spring整合Mybatis Spring 整合 Mybatis 需要定义很多配置类 SpringConfig 配置类 导入 JdbcConfig 配置类 导入 MybatisConfig ...
随机推荐
- 【转】awk 里的substr函数用法举例
awk 里的substr函数用法举例: 要截取的内容:2007-08-04 04:45:03.084 - SuccessfulTradeResult(status: 1, currencyPair: ...
- 浅谈最大流的Dinic算法
PART 1 什么是网络流 网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关.网络流的理论和应用在不断发展,出现了具有增益的流.多终端流.多商品流以及网络流的分解与 ...
- 基于SpringMVC+Mybatis搭建简单的前后台交互系统
前面博文有一篇 名为基于tomcat+springMVC搭建基本的前后台交互系统(http://www.cnblogs.com/hunterCecil/p/6924935.html),例文中使用了Io ...
- 浅析JAVA序列化
1.简述 Serialization(序列化) 是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 在分布式环境中,经常需要将Objec ...
- JAVA并发编程学习笔记------锁顺序死锁
一.需求描述: 将资金从一个账户转移到另一个账户. 二.程序实现: (1)账户类: public class Account { private long account; public Accoun ...
- MySQL笔记-语句的执行顺序
在一次查询线上问题时发现有以下两条同样的SQL,执行后数据的顺序不一样: SELECT * FROM nns_assists_item AS asset WHERE asset.nns_assist_ ...
- 如何使用Python读取大文件
背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...
- Tomcat时区设置方法[转]
最近被问到了关于Tomcat时区设置方法,还没碰到类似的问题,网上说是记录日志和定时任务时可能会出现,目前还未发现,先记录下来. 原文地址:http://blog.csdn.net/x_yp/arti ...
- <转>年终盘点!2017年超有价值的Golang文章
马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍. 文章排名不分先后, 文章也不一定完全按照日期来排列.我按照文章的大致内容分了类,便于查找 ...
- wenpack-simple+elementUI配置
首先跟着element官方文档走一遍 注意把.babelrc改成这样 { "presets": [ ["env", { "modules": ...