基于springboot的多数据源配置
概述
详细
一、前言
本篇demo实现了springboot项目实现了多数据源切换的功能。对一些有多个数据库的项目来说是一个很好的参考。
关于动态数据源的切换的方案有很多,核心只有两种。一种是构建多套环境,另一种是基于spring原生的 AbstractRoutingDataSource 切换。如果你的数据源较少,场景不复杂,选择以上任意一种都可以。如果你需要更多特性,可以参考本demo。
二、实现过程(使用方法)
引入dynamic-datasource-spring-boot-starter。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
2.配置数据源。
spring:
datasource:
dynamic:
datasource:
master:
username: root
password: root
url: jdbc:mysql://localhost/master?characterEncoding=utf-8&useSSL=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
driver-class-name: com.mysql.jdbc.Driver
slave:
username: root
password: root
url: jdbc:mysql://localhost/slave?characterEncoding=utf-8&useSSL=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
driver-class-name: com.mysql.jdbc.Driver
3.使用 @DS 切换数据源
@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。
注解在service实现或mapper接口方法上,但不建议同时在service和mapper注解。
package com.zxh.service.impl; import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zxh.entity.User;
import com.zxh.mapper.UserMapper;
import com.zxh.service.UserService; import org.springframework.stereotype.Service; @Service
@DS("slave")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override
@DS("master")//这里必须包一层,不能调用mp默认的插入,因为会走到从库去
public void addUser(User user) {
baseMapper.insert(user);
} @Override
@DS("slave")
public User selectSlaveUser(Long id) {
return baseMapper.selectById(id);
}
}
4.集成mybatis-plus
只要进入mybatisPlus相关jar包,项目自动集成。 兼容mybatisPlus 2.x和3.x的版本。
只要注解在mybatisPlus的mapper或serviceImpl上即可完成mp内置方法切换。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
5.在本地的mysql分别建master跟slave两个数据库


6.在两个数据库分别建user表,表结构如下:

7.项目演示:

a).执行testAddUser
@Test
public void testAddUser() {
User user = new User();
user.setName("测试用户" + random.nextInt());
user.setAge(random.nextInt(100));
userService.addUser(user);
}
@Override
@DS("master")//这里必须包一层,不能调用mp默认的插入,因为会走到从库去
public void addUser(User user) {
baseMapper.insert(user);
}
因为我们在addUser里加了@DS("master")注解,所以会走到主库里面,可以看到master数据库插了一条记录:

b).执行testSelectById,slave数据库里面有一条数据如下:

@Test
public void testSelectById() {
User user = userService.selectSlaveUser(2L);
System.out.println(user.getName());
}
执行后结果,可以看到后台打印了用户名

这样就实现了动态加载多数据源的效果。
三、项目结构图

三、常见问题
多个库的事物如何处理?
不能 不能 不能,一个业务操作涉及多个库不要加事务。
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
基于springboot的多数据源配置的更多相关文章
- springboot+ibatis 多数据源配置
这个是boot基本版本包,因为我用的打包方式是war所以去除掉了boot内置的tomcat,但是为了方便测试又引入了内置tomcat,只要添加<scope>provided</sco ...
- springboot之多数据源配置JdbcTemplate
springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...
- SpringBoot 的多数据源配置
最近在项目开发中,需要为一个使用 MySQL 数据库的 SpringBoot 项目,新添加一个 PLSQL 数据库数据源,那么就需要进行 SpringBoot 的多数据源开发.代码很简单,下面是实现的 ...
- springboot mybatis 多数据源配置
首先导入mybatis等包,这里就不多说. 下面是配置多数据源和mybatis,每个数据源对应一套mybatis模板 数据源1: package com.aaaaaaa.config.datasour ...
- Springboot+Druid 动态数据源配置监控
一.引入maven依赖,使用 starter 与原生 druid 依赖配置有所不同 <dependency> <groupId>com.alibaba</groupId& ...
- springboot mybatis 多数据源配置支持切换以及一些坑
一 添加每个数据源的config配置,单个直接默认,多个需要显示写出来 @Configuration @MapperScan(basePackages ="com.zhuzher.*.map ...
- SpringBoot:阿里数据源配置、JPA显示sql语句、格式化JPA查询的sql语句
1 数据源和JPA配置 1.1 显示sql配置和格式化sql配置 者两个配置都是属于hibernate的配置,但是springdatajpa给我们简化了:所有hibernate的配置都在jpa下面的p ...
- SpringBoot项目多数据源配置
博主总结的不错,事务也考虑到了,存一下: https://blog.csdn.net/xqnode/article/details/86498507
- 基于注解实现SpringBoot多数据源配置
1.功能介绍 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.最近在学习的过程中使用注解的方式实现了一个Springboot项目多数据源的功能.具体实现方式如下. 2.在applicatio ...
随机推荐
- 读书笔记,《Java 8实战》第五章,使用流
本章我们将会了解到关于Stream API的很多操作,这些操作能够完成很多复杂的查询,比如,比如筛选,切片,映射,查找,匹配和规约, 第一节,筛选和切片 首先我们来看看用谓词来选择流动的元素,主 ...
- mybatis 乐观锁和逻辑删除
本篇介绍easymybatis如配置乐观锁和逻辑删除. 乐观锁 easymybatis提供的乐观锁使用方式跟JPA一样,使用@Version注解来实现.即:数据库增加一个int或long类型字段ver ...
- 用JQuery 判断某个属性是否存在hasAttr的解决方法
在jquery编码中,我们会判断元素是否存在某个属性.比如是否包含 class="new" 的样式呢.JQuery判断就非常简单了,因为有 hasClass这个方法 $(" ...
- nginx配置目录列表访问权限
我们知道apache httpd默认情况下会显示访问目录的文件列表,但是nginx访问时如果目录下面没有默认首页,那么会返回403 Forbidden的错误,表示没有权限访问,比如根目录就是nginx ...
- win7基于mahout推荐之用户相似度计算
http://www.douban.com/note/319219518/?type=like win7基于mahout推荐之用户相似度计算 2013-12-03 09:19:11 事情回到半年 ...
- [Algorithm] Print 2-D array in spiral order
The idea to solve the problem is set five variable, first direction, we need to switch direction aft ...
- oracle SGA
3.2 SGA系统全局区--System global area(SGA) 是一组共享的内存结构,它里面存储了oracle数据库实例(instance)的数据和控制文件信息.如果有多个用户同时连接到数 ...
- linux:C++的socket编程
基本的局域网聊天 局域网聊天TCP服务端: #include <sys/types.h> #include <sys/socket.h> #include <stdio. ...
- ReactJS.NET 之 Demo 初探
ReactJS.NET 是专对 .NET 平台开发者设计,让我们不只可以在前端去Render出页面,也可以在Server端去Render页面.开发 ReactJS 可以用一般JS 库,也可以通过类似X ...
- Netcore使用MailKit进行邮件发送
public void TestSendMailDemo() { var message = new MimeKit.MimeMessage(); message.From.Add(new MimeK ...