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 ...
随机推荐
- 2017 .NET 開發者須知
筆記-Scott Hanselman 的 2017 .NET 開發者須知 转载http://blog.darkthread.net/post-2017-01-16-dotnet-dev-should- ...
- UTF8编码
UTF-8是Unicode的实现方式之一. UTF-8最大的一个特点,就是它是一种变长的编码方式.它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度. UTF-8的编码规则很简单,只有二 ...
- [JLOI2011]基因补全
1973: [JLOI2011]基因补全 Time Limit: 1 Sec Memory Limit: 256 MB Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸), ...
- java Object类是可以接收集合类型的
废话不多说,上代码: package com.core.test; import java.util.ArrayList; import java.util.HashMap; import java. ...
- Storm 对 0.10.x 版 Kafka之commit offsets
由于 0.10.x 版 Kafka 与 0.8.x 版有很大的变化,这种变化对下游 Storm 有非常大的影响,0.10.x 版的 Kafka 不但增加了权限管理的功能,而且还将 simple 和 h ...
- MongoDB Driver 简单的CURD
c#中我们可以使用MongoDB.Driver驱动进行对MongoDB数据库的增删改查. 首先需要在NuGet中安装驱动 安装完毕后会发现会有三个引用 其中 MongoDB.Driver和MongoD ...
- 关于css选择器的一些细节
1.如何区分一个html标签的不同样式 使用标签名.类名的方式解决 如果希望特别强调其中的某一个或几个元素,处理的方案有三个: 1.id选择器 2.class选择器 3.层级选择器 看下面的代码: & ...
- python3操作socketserver
socketserver是标准库中的一个高级模块,用于网络客户端与服务器的实现.模块中,已经实现了一些可供使用的类. 在python3中,导入socketserver模块使用的命令: import s ...
- 使用webpack、babel、react、antdesign配置单页面应用开发环境
这是Webpack+React系列配置过程记录的第一篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...
- bzoj 4873: [Shoi2017]寿司餐厅 [最小割]
4873: [Shoi2017]寿司餐厅 题意:略 唯一会做的... 一眼最小割 就是最大权闭合子图呀 \(s\rightarrow d_{positive} \rightarrow -d_{negt ...