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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM