Springboot使用sharedingjdbc实现分库分表
作者:可乐cc呀
一、简介
Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。
目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。
开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。
- 官网:http://shardingsphere.apache.org/index_zh.html
- 下载地址:https://shardingsphere.apache.org/document/current/cn/downloads/
- 快速入门:https://shardingsphere.apache.org/document/current/cn/quick-start/shardingsphere-jdbc-quick-start/
二、使用注意事项
- 使用版本问题,不同版本之间存在差异较大(参数),请参考官方文档,切记不可随意百度
- update 时,不可对分片字段进行更新(分片字段必须在规则上保持固定)
- 5.1.0版本使用shardingsphere-jdbc-core-spring-boot-starter时,并且使用druid时,需要加dbcp依赖
- 时间字段作为分片字段时,需要使用date类型,不可使用localDataTime 或者localDate类型
- 数据分片后主键自增问题,需要使用分布式主策略,例如利用redis自增主键,雪花算法,UUID等
- 分页查询跨表较大时候,shareding会进行表的union 操作,可能会造成数据瓶颈(业务上做处理)
- 不支持自动建表,自动分片功能需自行编码
- 部分复杂查询不支持,请参考官网:https://shardingsphere.apache.org/document/5.1.0/cn/user-manual/shardingsphere-jdbc/unsupported/
三、项目使用
添加pom依赖
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> </dependency> <!-- ShardingJDBC 5.1.0使用druid连接池需要加dbcp依赖 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-dbcp</artifactId> </dependency>
yml配置信息
spring: ### 处理连接池冲突 ##### main: allow-bean-definition-overriding: true shardingsphere: # 是否启用 Sharding enabled: false # 打印sql props: sql-show: false datasource: names: ds0 ds0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://123.57.164.186:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # username: root # password: JoygisIot@2023 url: jdbc:mysql://123.57.23.160:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 username: root password: JoygisIot@2023 # 数据源其他配置 initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true, testOnBorrow: false testOnReturn: false poolPreparedStatements: true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 #filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 rules: sharding: # 表策略配置 tables: # t_user 是逻辑表 b_compaction_data: # 配置数据节点,这里是按月分表 # 示例1:时间范围设置在202201 ~ 210012 # actualDataNodes: mydb.t_user_$->{2022..2100}0$->{1..9},mydb.t_user_$->{2022..2100}1$->{0..2} # 示例2:时间范围设置在202201 ~ 202203 #actualDataNodes: ds${0..1}.tmp_order_item actualDataNodes: ds0.b_compaction_data tableStrategy: complex: sharding-columns: gps_time,sn algorithm-class-name: shardingAlgorithmName: time-sn-sharding-altorithm keyGenerateStrategy: column: id keyGeneratorName: compaction-data-id # 分片算法配置 keyGenerators: compaction-data-id: type: 'INCREMENT' shardingAlgorithms: time-sn-sharding-altorithm: # 类型:自定义策略 type: CLASS_BASED props: # 分片策略 strategy: complex # 分片算法类 algorithmClassName: com.joygis.sharding.algorithm.ComplexTimeAndSnShardingAlgorithm
代码配置
- a. 自定义数据源
说明:shardingSphereDataSource 为默认数据源,如需修改配置信息,可重新定义 重新注入即可
- b. 使用动态数据源
说明: 查询接口中,直接标记数据类型即可,如为mabatisplus 请使用@Ds注解
自定义主键策略
说明:shareding中用了大量的java spi 加载机制进行代码解耦,包括主键生成策略,spi机制此处不做介绍请自行百度,此处使用的为redis自增主键(查询中例如id比较),保证id 全局唯一,type类型必须与yml文件中保持一致
单字段分表策略
说明: 类型指定为Standard ,实现StandardShardingAlgorithm类即可,项目中因要求不同,此处代码完成但为使用,需要实现两个doshared方法,PreciseShardingValue 为精确匹配 例如 in、= 等方式,RangeShardingValue为范围匹配 例如 between,< ,> 等
单字段分表策略
说明: 如上述yml 所示配置,实现ComplexKeysShardingAlgorithm接口即可,仅一个接口ComplexKeysShardingValue 中存在两个属性,分别为范围属性及精确指定属性
自动创建表
说明: 判断表是否存在(例如本地缓存,提升速度),如果存在则不创建表,如果不存在,则直接创建表,创建完成后需要更新shareding 配置信息,详细代码 请查看ShardingAlgorithmTool.tableNameCacheReloadAll();类
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。