同步操作将从 baomidou/dynamic-datasource 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
dynamic-datasource-spring-boot-starter是一个基于springboot的快速继承多数据源的启动器。
其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.0.x。
它主要用于读写分离,一主多从的环境。 (也可以纯粹当成多库使用)
主数据库 建议 只执行 INSERT
UPDATE
DELETE
操作。
从数据库 建议 只执行 SELECT
操作。
如果你的项目比较复杂,建议使用 sharding-jdbc 。
dynamic-datasource-example 一个简单能直接运行的项目。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
spring.datasource.dynamic.master 配置唯一主数据源(写库)
spring.datasource.dynamic.slave 配置每一个从数据源(读库)
spring:
datasource:
dynamic:
force-master: true #遇到事物强制主库,默认值就为true。
master:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3306/dynamic?characterEncoding=utf8&useSSL=false
slave:
one:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3307/dynamic?characterEncoding=utf8&useSSL=false
two:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3308/dynamic?characterEncoding=utf8&useSSL=false
#......省略
@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解,强烈建议注解在service实现或mapper接口方法上。
注解 | 结果 |
---|---|
没有@DS | 主库 |
@DS("slave") | 存在slave指定slave,不存在主库 |
@DS | 根据DynamicDataSourceStrategy策略,选择一个从库。默认负载均衡策略。 |
注意 | force-master 会判断当前方法和类上是否有@Transational注解,如果有会强制主库。 |
@Service
@DS
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS("two")
public List<Map<String, Object>> selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}
在mybatis环境下也可注解在mapper接口层。
@DS("master")
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();
}
springBoot2.x默认使用HikariCP,但在国内Druid的使用者非常庞大,此项目特地对其进行了适配,完成多数据源下使用Druid进行监控。
注意:主从可以使用不同的数据库连接池,如master使用Druid监控,从库使用HikariCP。 如果不配置连接池type类型,默认是Druid优先于HikariCP。
druid-spring-boot-starter
依赖。<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
为什么要排除DruidDataSourceAutoConfigure ?
DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,其会在原生的spring.datasource下找url,username,password等。而我们动态数据源的配置路径是变化的。
druid-spring-boot-starter
的配置。spring:
datasource:
druid:
stat-view-servlet:
loginUsername: admin
loginPassword: 123456
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
druid:
initial-size: 3
max-active: 8
min-idle: 2
max-wait: -1
min-evictable-idle-time-millis: 30000
max-evictable-idle-time-millis: 30000
time-between-eviction-runs-millis: 0
validation-query: select 1
validation-query-timeout: -1
test-on-borrow: false
test-on-return: false
test-while-idle: true
pool-prepared-statements: true
max-open-prepared-statements: 100
filters: stat,wall
share-prepared-statements: true
如上即可配置访问用户和密码,访问 http://localhost:8080/druid/index.html 查看druid监控。
数据源来源的默认实现是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();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。