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
posted @ 2018-05-30 13:35  甜菜波波  阅读(15706)  评论(2编辑  收藏  举报