简介

dynamic-datasource-spring-boot-starter 基于 springBoot2.0.

它适用于读写分离,一主多从的环境。

主数据库使用 INSERT UPDATE DELETE 操作.

从数据库使用 SELECT 操作.

如果你的项目比较复杂,建议使用 sharding-jdbc.

示例

dynamic-datasource-example 一个简单能直接运行的项目。

使用方法

  1. 引入dynamic-datasource-spring-boot-starter。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
  1. 配置主从数据源。

spring.datasource.dynamic.master 配置唯一主数据源(写库)

spring.datasource.dynamic.slaves 配置每一个从数据源(读库)

spring:
datasource:
dynamic:
master:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3307/dynamic?characterEncoding=utf8&useSSL=false
slaves:
one:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3308/dynamic?characterEncoding=utf8&useSSL=false
two:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3309/dynamic?characterEncoding=utf8&useSSL=false
  1. 切换数据源。

使用 @DS 注解切换数据源。

可以注解在方法上,可以注解在service实现或mapper接口方法上。

注解 结果
没有@DS 主库
@DS("slave") 存在slave指定slave,不存在主库
@DS 根据DynamicDataSourceStrategy策略,选择一个从库。默认负载均衡策略。
@Service
public class UserServiceImpl implements UserService { @Autowired
private JdbcTemplate jdbcTemplate; @DS("one")
public List<Map<String, Object>> selectAll() {
return jdbcTemplate.queryForList("select * from user");
} @Override
@DS
public List<Map<String, Object>> selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
} }

在mybatis环境下也可注解在mapper接口层。

public interface UserMapper {

  @Insert("INSERT INTO user (name,age) values (#{name},#{age})")
boolean addUser(@Param("name") String name, @Param("age") Integer age); @Update("UPDATE user set name=#{name}, age=#{age} where id =#{id}")
boolean updateUser(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age); @Delete("DELETE from user where id =#{id}")
boolean deleteUser(@Param("id") Integer id); @Select("SELECT * FROM user")
@DS
List<User> selectAll(); }

自定义

  1. 自定义数据源来源。

数据源来源的默认实现是YmlDynamicDataSourceProvider,其从yaml或properties中读取信息并解析出主从信息。

场景:有些人想把从库信息配置到主库的某个表中,如有个表名slave_datasource。现在需要用户自己去实现以下接口并注入。

public interface DynamicDataSourceProvider {

  /**
* load master
*
* @return masterDataSource
*/
DataSource loadMasterDataSource(); /**
* load slaves
*
* @return slaveDataSource
*/
Map<String, DataSource> loadSlaveDataSource(); }
  1. 自定义从库选择策略。

默认的策略是负载均衡的策略,LoadBalanceDynamicDataSourceStrategy。 也提供了一个随机策略,RandomDynamicDataSourceStrategy。

public interface DynamicDataSourceStrategy {

  /**
* determine a slaveId
*
* @param slaveDataSourceLookupKeys slaveKeys
* @return slaveId
*/
String determineSlaveDataSource(String[] slaveDataSourceLookupKeys); }

重写策略并注入。

  @Bean
public DynamicDataSourceStrategy dynamicDataSourceStrategy() {
return new RandomDynamicDataSourceStrategy();
} 参考:https://gitee.com/tkmeeta/dynamic-datasource-spring-boot-starter
DEMO:https://pan.baidu.com/s/1TWEVnOcUGoYVTy0YKbah0w

SpringBoot+MybatisPlus(多数据源和主从分离)的更多相关文章

  1. 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务

    文章来自: https://blog.csdn.net/qq_29242877/article/details/79033287 在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据 ...

  2. springBoot(13)---整合Druid实现多数据源和可视化监控

    SpringBoot整合Druid实现多数据源和可视化监控 先献上github代码地址:https://github.com/yudiandemingzi/springboot-manydatasou ...

  3. SpringBoot 整合 MyCat 实现读写分离

    MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量存储:提高了查询性能.文章介绍如何实现MyCat连接MySQL实现主从分离,并集成Sp ...

  4. 基于MySql主从分离的代码层实现

    前言   该文是基于上篇<MySQL主从分离的实现>的代码层实现,所以本文配置的主数据库和从数据库的数据源都是在上篇博文中已经介绍了的. 动态选择数据源的配置   由于我们在写数据的时候需 ...

  5. CDbConnectionExt.php 23.2实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置

      <?php   /** * 实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置. * 具体使用主数据库还是从数据库,使用如下规则: * 1.CDbComm ...

  6. SpringMVC4+MyBatis+SQL Server2014 基于SqlSession实现读写分离(也可以实现主从分离)

    前言 上篇文章我觉的使用拦截器虽然方便快捷,但是在使用读串还是写串上你无法控制,我更希望我们像jdbc那样可以手动控制我使用读写串,那么这篇则在sqlsession的基础上实现读写分离, 这种方式则需 ...

  7. SSM 配合 Mysql 数据库和代码数据源主从分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  8. MySQL数据库主从分离的配置方法

    1.介绍 MySQL数据库设置读写分离,可以使对数据库的写操作和读操作在不同服务器上执行,提高并发量和响应速度.现在的网站一般大点的,都采用有数据库主从分离.读写分离,既起到备份作用也可以减轻数据库的 ...

  9. spring-boot+mybatisPlus+shiro的集成demo 我用了5天

    spring-boot + mybatis-plus + shiro 的集成demo我用了五天 关于shiro框架,我还是从飞机哪里听来的,就连小贱都知道,可我母鸡啊.简单百度了下,结论很好上手,比s ...

随机推荐

  1. 【树形DP】Codeforces Round #395 (Div. 2) C. Timofey and a tree

    标题写的树形DP是瞎扯的. 先把1看作根. 预处理出f[i]表示以i为根的子树是什么颜色,如果是杂色的话,就是0. 然后从根节点开始转移,转移到某个子节点时,如果其子节点都是纯色,并且它上面的那一坨结 ...

  2. 【数论】【暴力】bzoj4052 [Cerc2013]Magical GCD

    考虑向一个集合里添加一个数,它们的gcd要么不变,要么变成原gcd的一个约数.因此不同的gcd只有log个. 所以对于每个位置,维护一个表,存储从这个位置向前所有的不同的gcd及其初始位置,然后暴力更 ...

  3. 【最小割】【Dinic】bzoj3275 Number

    每个点拆点,分别向源/汇连a[i]的边,满足条件的相互连INF的边,答案为sum-maxflow*2. 因为若有几个点不能同时被选,我们要贪心地选择其中和尽量大的部分,这可以由最小割来保证. #inc ...

  4. 【分块】bzoj3226 [Sdoi2008]校门外的区间

    题解见 : http://blog.csdn.net/iamzky/article/details/41088151 ORZ ZKY 2个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...

  5. [CF468D]Tree

    [CF468D]Tree 题目大意: ​ 一棵\(n(n\le10^5)\)个编号为\(1\sim n\)的点的带边权的树,求一个排列\(p_{1\sim n}\),使\(\sum dis(i,p_i ...

  6. Ajax 使用formdata 实现 无刷新表单上传

    FormData对象的作用就类似于这里的serialize()方法,不过FormData是浏览器原生的,且支持二进制文件 1.这里实现一个无刷新上传图片,成功后页面显示 点击button 触发隐藏的 ...

  7. CentOS 6.9使用Setup配置网络(解决dhcp模式插入网线不自动获取IP的问题)

    说明:dhcp模式插入网线不自动获取IP是因为网卡没有激活,造成这种原因的,应该是安装系统时没有插入网线造成的. 解决方法: 修改网卡配置文件 vim /etc/sysconfig/network-s ...

  8. SQL Server Latch Classes Library

    https://www.sqlskills.com/help/latches/ (Companion SQL Server Wait Types Library) This site lists al ...

  9. 玩转JavaScript正则表达式

    Why Regular Expression 我们先来看看,我们干哈要学正则表达式这玩意儿: 复杂的字符串搜寻.替换工作,无法用简单的方式(类似借助标准库函数)达成. 能够帮助你进行各种字符串验证. ...

  10. 2016年31款轻量高效的开源 JavaScript 插件和库

    目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有 ...