简介

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. 【进制转换】CODEVS 1740 进制计算器

    #include<cstdio> #include<iostream> #include<string> using namespace std; string s ...

  2. Swift中获取相册图片与保存到相册

    关于这个网上目前位置记录的资料比较少,记录一下这个坑 获取相册图片 1: var iPC = UIImagePickerController() 2: iPC.sourceType = UIImage ...

  3. 理解SQL原理,写出高效代码

    做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,数据量大,人员流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还能保证下 ...

  4. Delphi 设置时间格式

    // 设置WINDOWS系统的短日期的格式SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, 'yyyy-MM-dd'); Applicat ...

  5. notepad++ 常用的插件及教程

    NotePad++ 教程 HEX-Editor      http://files.cnblogs.com/pengdonglin137/HexEditor_0_9_5_UNI_dll.zip 我的N ...

  6. Swift,类的调用

    1.class或者struct如果没有实例没办法直接调用 (1)设置class后可直接调用 class S{ static var width:Int{ //static代表公有的,都可使用 retu ...

  7. Java ArrayList的模拟实现

    package test; import java.util.Arrays; import java.util.Collection; public class MyArrayList<E> ...

  8. LeakCanary 的使用遇到的弯路

    基本上来源是:  http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ 1. demon 中自带的android_v7兼容包有问题的,建议自己使 ...

  9. 三位一体的漏洞分析方法-web应用安全测试方法

    本文转自乌云知识库 0x00 前言 节选自: http://www.owasp.org.cn/OWASP_Conference/owasp-20140924/02OWASPWeb20140915.pd ...

  10. react-native + react-native-tab-navigator 实现 TabBar

    1.安装 react-native-tab-navigator yarn add react-native-tab-navigator 2.页面调用 /** * 主页面 */ import React ...