zoukankan      html  css  js  c++  java
  • SpringBoot+MybatisPlus(多数据源和主从分离)

    简介

    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
  • 相关阅读:
    使用echo $? 查看命令成功执行的原理
    Ubuntu 12.04下NFS安装配置图解
    使用nfsstat命令查看NFS服务器状态
    ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)
    toad调用存储过程,存储过程调用sql 类
    指纹协查统计sql
    oracle 解锁表
    【转】经典排序算法
    wget 命令用法详解
    Linux 带宽、CPU、内存占用情况
  • 原文地址:https://www.cnblogs.com/tiancai/p/9110431.html
Copyright © 2011-2022 走看看