当前位置:网站首页>shardingsphere动态数据源
shardingsphere动态数据源
2022-07-03 03:27:00 【今朝花落悲颜色】
项目中使用到了mybatis-plus,多数据源切换用的是dynamic-datasource-spring-boot-starter,只要加@DS注解就可以切换,非常方便,但随着业务越来越复杂,数据量越来越多,就涉及到读写分离分库分表了,我们选择shardingsphere无代码侵入解决方案,将shardingsphere交给dynamic-datasource管理,既可以方便切换数据源又可以使用shardingsphere读写分离分库分表等功能。
pom引入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.1.1</version><!--建议使用此版本,高版移除了某些参数--> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>4.0.0-RC1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
动态数据源配置
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider; import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractDataSourceAdapter; import org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Primary; import javax.annotation.Resource; import javax.sql.DataSource; import java.util.Map; /** * 动态数据源配置: * * 使用{@link com.baomidou.dynamic.datasource.annotation.DS}注解,切换数据源 * * <code>@DS(DataSourceConfiguration.SHARDING_DATA_SOURCE_NAME)</code> * * @author ws * @date 2022/6/21 15:19 */ @Configuration @AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class}) public class DataSourceConfiguration { /** * 分表数据源名称 */ private static final String SHARDING_DATA_SOURCE_NAME = "shardingjdbc"; /** * 动态数据源配置项 */ @Autowired private DynamicDataSourceProperties properties; /** * shardingjdbc有四种数据源,需要根据业务注入不同的数据源 * * <p>1. 未使用分片, 脱敏的名称(默认): shardingDataSource; * <p>2. 主从数据源: masterSlaveDataSource; * <p>3. 脱敏数据源:encryptDataSource; * <p>4. 影子数据源:shadowDataSource * */ @Lazy @Resource(name = "shardingDataSource") AbstractDataSourceAdapter shardingDataSource; @Bean public DynamicDataSourceProvider dynamicDataSourceProvider() { Map<String, DataSourceProperty> datasourceMap = properties.getDatasource(); return new AbstractDataSourceProvider() { @Override public Map<String, DataSource> loadDataSources() { Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap); // 将 shardingjdbc 管理的数据源也交给动态数据源管理 dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource); return dataSourceMap; } }; } /** * 将动态数据源设置为首选的 * 当spring存在多个数据源时, 自动注入的是首选的对象 * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了 * * @return */ @Primary @Bean public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) { DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(); // dataSource.setPrimary(properties.getPrimary()); //这里设置sharding管理的数据源为默认数据源, //如果设置其它则在yml文件里配置primary:数据源 dataSource.setPrimary(SHARDING_DATA_SOURCE_NAME); dataSource.setStrict(properties.getStrict()); dataSource.setStrategy(properties.getStrategy()); dataSource.setProvider(dynamicDataSourceProvider); dataSource.setP6spy(properties.getP6spy()); dataSource.setSeata(properties.getSeata()); return dataSource; } }
application.yml,这里shardingsphere配置的读写分离策略
server: port: 9099 servlet: context-path: /quarant/server spring: shardingsphere: datasource: #配置真实数据源 names: ds0,ds1 ds0: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://172.18.11.9:3306/quarant_db?serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&useSSL=false&nullNamePatternMatchesAll=true&useUnicode=true&characterEncoding=UTF-8 username: root password: [email protected]3456 type: com.zaxxer.hikari.HikariDataSource initialSize: 5 minIdle: 10 maxActive: 50 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 maxEvictableIdleTimeMillis: 900000 validationQuery: SELECT 1 FROM DUAL ds1: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://172.18.11.9:3306/quarant_db1?serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&useSSL=false&nullNamePatternMatchesAll=true&useUnicode=true&characterEncoding=UTF-8 username: root password: [email protected] type: com.zaxxer.hikari.HikariDataSource initialSize: 5 minIdle: 10 maxActive: 50 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 maxEvictableIdleTimeMillis: 900000 validationQuery: SELECT 1 FROM DUAL sharding: master-slave-rules: master-test0: # 哪一个主节点 master-datasource-name: ds0 # 指定主节点名字 slave-data-source-names: ds0,ds1 # 指定读节点名字,多个读节点用逗号分开 # 配置从库选择策略,提供轮询与随机,这里选择用轮询 masterslave: load-balance-algorithm-type: round_robin props: sql: show: false # 日志显示SQL datasource: # 动态数据源配置 dynamic: datasource: slave: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://172.18.11.9:3306/quarant_db?serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&useSSL=false&nullNamePatternMatchesAll=true&useUnicode=true&characterEncoding=UTF-8 username: root password: [email protected] health: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/postgres?currentSchema=rcw username: postgres password: admin type: com.zaxxer.hikari.HikariDataSource hikari: min-idle: 5 max-pool-size: 100 auto-commit: true idle-timeout: 60000 max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1
默认是shardingsphere配置的两个数据源,如果想切换数据源使用@DS注解即可轻松切换。
@GetMapping("/querydb3")
//数据源db3
@DS("db3")
public String querydb3() {
QuarantineInfo quarantineInfo = quarantineInfoService.getById(53);
return JSON.toJSONString(quarantineInfo);
}//默认数据源
@GetMapping("/query")
public String query() {
QuarantineInfo quarantineInfo = quarantineInfoService.getById(53);
return JSON.toJSONString(quarantineInfo);
}
边栏推荐
- 用Three.js做一个简单的3D场景
- Mongodb replication set [master-slave replication]
- redis高级应用【密码防护、数据持久化、主从同步、哨兵模式、事务】【暂未完成(半成品)】
- Nasvit: neural architecture search of efficient visual converter with gradient conflict perception hypernetwork training
- labelimg生成的xml文件转换为voc格式
- PAT乙级常用函数用法总结
- Using jasmine to monitor constructors - spying on a constructor using Jasmine
- 静态网页 和 动态网页的区别 & WEB1.0和WEB2.0的区别 & GET 和 POST 的区别
- Hi3536c v100r001c02spc040 cross compiler installation
- Ansible introduction [unfinished (semi-finished products)]
猜你喜欢
MySQL practice 45 lecture [transaction isolation]
900W+ 数据,从 17s 到 300ms,如何操作
Idea set method call ignore case
Use three JS make a simple 3D scene
Hi3536C V100R001C02SPC040 交叉编译器安装
The series of hyperbolic function in daily problem
MySql实战45讲【全局锁和表锁】
Avec trois. JS fait une scène 3D simple
MySQL practice 45 [SQL query and update execution process]
用Three.js做一个简单的3D场景
随机推荐
二进制流转换成字节数组
BigVision代码
Open Visual Studio 2010 hangs when opening a SQL file sql file
docker安装及启动mysql服务
Small guide for rapid formation of manipulator (VIII): kinematic modeling (standard DH method)
用Three.js做一个简单的3D场景
Limit of one question per day
Summary of determinant knowledge points in Chapter 1 of Linear Algebra (Jeff's self perception)
Basic operations of mongodb [add, delete, modify, query]
File rename
Mongodb installation & Deployment
Summary of electromagnetic spectrum
[mathematical logic] normal form (conjunctive normal form | disjunctive normal form | major item | minor item | maximal item | minor item | principal conjunctive normal form | principal disjunctive no
Elsevier latex submitted the article pdftex def Error: File `thumbnails/cas-email. jpeg‘ not found: using draf
Agile certification (professional scrum Master) simulation exercises
Nanning water leakage detection: warmly congratulate Guangxi Zhongshui on winning the first famous brand in Guangxi
Stop using system Currenttimemillis() takes too long to count. It's too low. Stopwatch is easy to use!
Vs 2019 configure tensorrt to generate engine
403 error displayed when vs cloning
MySql实战45讲【事务隔离】