sharding-jdbc5系列教程(一)springboot配置shardingjdbc+mybatis-plus+druid+dynamic-datasource
系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、shardingjdbc
-
- Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
- Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。
- Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。
- 相关概念这里不过多介绍,建议去官网看[shardingjdbc官网](https://shardingsphere.apache.org/)
- (一)springboot配置shardingjdbc+mybatis-plus+druid+dynamic-datasource,网上关于5.0教程有点少,与之前版本可能有不同,这里讲的是5.0+版本以上的
- 二、本教程基于shardingjdbc5.0+版本以上
-
- 1.引入库
- 2.配置mybatis-plus
-
- 具体配置依据需求更改,相关sharding-jdbc分片算法本片后续教程会讲解,这里之讲配置整合
- 3.配置datasource
- 4.配置完成,启动项目
-
- 使用方式很简单,在要使用shardingjdbc数据源的地方加上@DS("sharding")就行了
- 总结
-
-
- 这样几个框架就整合完毕了
-
前言
shardingjdbc系列教程
一、shardingjdbc
Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。
Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。
相关概念这里不过多介绍,建议去官网看shardingjdbc官网
(一)springboot配置shardingjdbc+mybatis-plus+druid+dynamic-datasource,网上关于5.0教程有点少,与之前版本可能有不同,这里讲的是5.0+版本以上的
二、本教程基于shardingjdbc5.0+版本以上
1.引入库
代码如下(示例):
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-namespace</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version></dependency>
2.配置mybatis-plus
server: port: 11000spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure main: allow-bean-definition-overriding: true datasource: druid: #druid管理页面配置 stat-view-servlet: enabled: true loginUsername: admin loginPassword: 123456 dynamic: #动态数据源配置 druid: filters: stat,wall,log4j2 # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config:multi-statement-allow: true datasource: master: username: root password: root url: jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 driver-class-name: com.mysql.cj.jdbc.Driver shardingsphere: datasource: names: db0 db0: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: root filters: stat,wall,log4j2 # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config:multi-statement-allow: true# db1:# driver-class-name: com.mysql.cj.jdbc.Driver# type: com.alibaba.druid.pool.DruidDataSource# url: jdbc:mysql://192.168.3.155:30002/database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8# username: root# password: root rules: # 配置分片规则 sharding: keyGenerators: snowflake: type: SNOWFLAKE props:workerId: 123 tables: # 配置 maxtemlog 表规则 max_temp_log: actualDataNodes: db0.max_temp_log_$->{0..1} # 配置分库策略# databaseStrategy:#standard:# shardingColumn: equipment_id# shardingAlgorithmName: auto-mod-4 # 配置分表策略 tableStrategy:standard: shardingColumn: equipment_id shardingAlgorithmName: table-inline keyGenerateStrategy:column: max_temp_log_idkeyGeneratorName: snowflake # 配置分片算法 bindingTables: max_temp_log autoTables: # 自动分片表规则配置 user: # 逻辑表名称 actualDataSources: db0 # 数据源名称 shardingStrategy: # 切分策略standard: # 用于单分片键的标准分片场景 shardingColumn: user_id # 分片列名称 shardingAlgorithmName: auto-mod-1 # 自动分片算法名称 sharding-algorithms: auto-mod-4: type: mod props:sharding-count: 1 auto-mod-1: type: mod props:sharding-count: 1 database-inline: type: INLINE props:algorithm-expression: db$->{equipment_id % 2} table-inline: type: INLINE props:algorithm-expression: max_temp_log_$->{equipment_id % 2} props: sql-show: truemybatis-plus: typeAliasesPackage: com.haiwei.springadmin.domainlogging: com: info
具体配置依据需求更改,相关sharding-jdbc分片算法本片后续教程会讲解,这里之讲配置整合
3.配置datasource
@Configuration@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class})public class DataSourceConfig { @Resource private DynamicDataSourceProperties properties; @Lazy @Resource(name = "shardingSphereDataSource") private DataSource shardingSphereDataSource; @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); dataSourceMap.put("sharding", shardingSphereDataSource); //打开下面的代码可以把 shardingjdbc 管理的数据源也交给动态数据源管理 (根据自己需要选择开启) // dataSourceMap.putAll(((MasterSlaveDataSource) masterSlaveDataSource).getDataSourceMap()); return dataSourceMap; } }; } /** * 将动态数据源设置为首选的 * 当spring存在多个数据源时, 自动注入的是首选的对象 * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了 */ @Primary @Bean public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) { DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(); dataSource.setPrimary(properties.getPrimary()); dataSource.setStrict(properties.getStrict()); dataSource.setStrategy(properties.getStrategy()); dataSource.setP6spy(properties.getP6spy()); dataSource.setSeata(properties.getSeata()); return dataSource; }}
4.配置完成,启动项目
使用方式很简单,在要使用shardingjdbc数据源的地方加上@DS(“sharding”)就行了
@DS("sharding")public interface MaxTempLogMapper extends BaseMapper<MaxTempLog> { int insertAll(MaxTempLog maxTempLog); List<MaxTempLog> searchByEquipmentId(@Param("equipmentId") Long equipmentId);}