Github |Gitee
dynamic-datasource-spring-boot-starter 基于 springBoot2.0.
它适用于读写分离,一主多从的环境。
主数据库使用 INSERT
UPDATE
DELETE
操作.
从数据库使用 SELECT
操作.
如果你的项目比较复杂,建议使用 sharding-jdbc .
dynamic-datasource-example 一个简单能直接运行的项目。
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency>
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
使用 @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(); }
数据源来源的默认实现是YmlDynamicDataSourceProvider,其从yaml或properties中读取信息并解析出主从信息。
场景:有些人想把从库信息配置到主库的某个表中,如有个表名slave_datasource。现在需要用户自己去实现以下接口并注入。
public interface DynamicDataSourceProvider { /** * load master * * @return masterDataSource */ DataSource loadMasterDataSource(); /** * load slaves * * @return slaveDataSource */ Map<String, DataSource> loadSlaveDataSource(); }
默认的策略是负载均衡的策略,LoadBalanceDynamicDataSourceStrategy。 也提供了一个随机策略,RandomDynamicDataSourceStrategy。
public interface DynamicDataSourceStrategy { /** * determine a slaveId * * @param slaveDataSourceLookupKeys slaveKeys * @return slaveId */ String determineSlaveDataSource(String[] slaveDataSourceLookupKeys); }
重写策略并注入。
@Bean public DynamicDataSourceStrategy dynamicDataSourceStrategy() { return new RandomDynamicDataSourceStrategy(); }