Springboot,使用sharedingjdbc 分库分表,最佳实践。

news2024/11/15 21:35:38

一、简介

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/

二、使用注意事项

  1. 使用版本问题,不同版本之间存在差异较大(参数),请参考官方文档,切记不可随意百度
  2. update 时,不可对分片字段进行更新(分片字段必须在规则上保持固定)
  3. 5.1.0版本使用shardingsphere-jdbc-core-spring-boot-starter时,并且使用druid时,需要加dbcp依赖
  4. 时间字段作为分片字段时,需要使用date类型,不可使用localDataTime 或者localDate类型
  5. 数据分片后主键自增问题,需要使用分布式主策略,例如利用redis自增主键,雪花算法,UUID等
  6. 分页查询跨表较大时候,shareding会进行表的union 操作,可能会造成数据瓶颈(业务上做处理)
  7. 不支持自动建表,自动分片功能需自行编码
  8. 部分复杂查询不支持,请参考官网: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. 自定义数据源

image.png

说明:shardingSphereDataSource 为默认数据源,如需修改配置信息,可重新定义 重新注入即可

b. 使用动态数据源

image.png

说明: 查询接口中,直接标记数据类型即可,如为mabatisplus 请使用@Ds注解

* 自定义主键策略

image.png

image.png

说明:shareding中用了大量的java spi 加载机制进行代码解耦,包括主键生成策略,spi机制此处不做介绍请自行百度,此处使用的为redis自增主键(查询中例如id比较),保证id 全局唯一,type类型必须与yml文件中保持一致

* 单字段分表策略

说明: 类型指定为Standard ,实现StandardShardingAlgorithm类即可,项目中因要求不同,此处代码完成但为使用,需要实现两个doshared方法,PreciseShardingValue 为精确匹配 例如 in、= 等方式,RangeShardingValue为范围匹配 例如 between,< ,> 等

* 单字段分表策略

说明: 如上述yml 所示配置,实现ComplexKeysShardingAlgorithm接口即可,仅一个接口ComplexKeysShardingValue 中存在两个属性,分别为范围属性及精确指定属性

* 自动创建表

说明: 判断表是否存在(例如本地缓存,提升速度),如果存在则不创建表,如果不存在,则直接创建表,创建完成后需要更新shareding 配置信息,详细代码 请查看ShardingAlgorithmTool.tableNameCacheReloadAll();类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WIFI电路原理时序检修思路

uart是串口&#xff0c;bt是蓝牙&#xff0c;hsic是高速接口。pcm是音频接口。时序图的第五步是发出就绪信号&#xff0c;然后第六步与门发出就绪信号。 wifi芯片是u8_rf。 特别说明&#xff1a;short表示短接。xw表示实际是看不到物体的&#xff0c;是直接相连的。 找信号50_…

MySQL 定位长事务(Identify Long Transactions)

在MySQL的运行中&#xff0c;经常会遇到一些长事务。长事务意味着长时间持有系统资源&#xff0c;这在OLAP系统中很常见&#xff0c;但在OLTP系统中&#xff0c;长事务意味着争用、并发降低&#xff0c;等待。长事务伴随的典型现象就是经常听到开发人员说"xxx表被锁住了……

2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

深入了解Figure的结构与层次

深入了解Figure的结构与层次 一 Matplotlib中的Figure1.1 Figure的概念和作用:1.2.创建Figure对象:1.3 Figure的属性和方法: 二 子图&#xff08;Axes&#xff09;的角色与创建2.1 子图&#xff08;Axes&#xff09;的概念&#xff1a;2.2 创建子图的方法&#xff1a;2.3 Axes的…

文件名翻译工具,文件名称翻译软件

无论是工作、学习还是生活&#xff0c;我们时常会遇到文件名称难以理解的情况。这时&#xff0c;一款优秀的文件名称翻译软件就显得尤为重要。今天&#xff0c;我要为大家介绍一个备受好评软件——文件批量改名高手&#xff0c;这款软件自带翻译功能&#xff0c;可以帮你轻松实…

【LangChain学习之旅】—(9) 用SequencialChain链接不同的组件

【LangChain学习之旅】—&#xff08;9&#xff09;用SequencialChain链接不同的组件 什么是 ChainLLMChain&#xff1a;最简单的链链的调用方式直接调用通过 run 方法通过 predict 方法通过 apply 方法通过 generate 方法 Sequential Chain&#xff1a;顺序链首先&#xff0c;…

认识数学建模

文章目录 1 什么是数学建模2 数学建模的比赛形式3 参加数学建模的好处4 数学建模的流程5 数学建模成员分工6 数学建模常用软件7 数学建模竞赛7.1 美国大学生数学建模竞赛7.2 MathorCup高校数学建模挑战赛7.3 华中杯大学生数学建模挑战赛7.4 认证杯数学建模网络挑战赛7.5 华东杯…

【投稿优惠|稳定出版】2024年经济、大数据与区块链国际学术会议(ICEBDB 2024)

【投稿优惠|稳定出版】2024年经济、大数据与区块链国际学术会议&#xff08;ICEBDB 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.icebdb.com会议地址&#xff1a;成都召开日期&#xff1a;2024/2/29截稿日期&#xff1a;2024/2/20 &#xff08;先投稿&#xff0…

MWORKS.Syslab 如何统一 Julia、C/C++、Python 乃至 MATLAB —— 解密多语言统一的底层机制

科学世界蓬勃发展&#xff0c;注入了许多时代特有的活力。年轻理科生们的口中逐渐出现了诸如“调参侠”“调包小子”“炼丹师”等新潮的调侃词语&#xff0c;这些来自机器学习/深度学习领域的“梗”在社交网络中逐渐扩散&#xff0c;让人们不禁感叹科学计算已经成为了炙手可热的…

如何安装MeterSphere并实现无公网ip远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通…

04 经典的OSPF

思维导图的方式回顾OSPF 什么是OSPF?为什么需要OSPF? - 华为 (huawei.com) 1 ospf 领行学习思维导图 1.1 ospf 的工作过程 建立领据表同步数据库计算路由表1.2 ospf 的状态

gitlab runner 安装、注册、配置、使用(Docker部署)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

vue3项目中用codemirror实现格式化java代码及不太成熟的历程

本期只介绍创作的曲折历程&#xff0c;并不能解决实际问题&#xff0c;现有插件不支持&#xff0c;总结在了最后 一、案例效果 vue3项目使用preitter 搭配prettier-plugin-java 实现codemirror 格式化 java 二、步骤 1. 安装prettier和prettier-plugin-java&#xff0c;可以…

如何快速解决局域网IP冲突问题?连接IP地址冲突如何用代理IP搞定?

随着互联网的普及&#xff0c;局域网已经成为了许多家庭和企业中不可或缺的一部分。然而&#xff0c;局域网中的IP地址冲突问题却时常困扰着用户。一旦出现IP地址冲突&#xff0c;网络连接就会变得不稳定&#xff0c;甚至无法正常上网。那么&#xff0c;如何快速解决局域网IP冲…

2024 高级前端面试题之 HTML 「精选篇」

该内容主要整理关于 HTML 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 HTML模块精选篇 1. 如何理解HTML语义化2. H5的新特性有哪些3. 说一下 HTML5 Drag API4. iframe有那些缺点5. 如何实现浏览器内多个标签页之间的通信6. 简述一下s…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第二天-ARM汇编(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1bG0tuVaACATvjLwD05j1FQ?pwd1688 提取码&#xff1a;1688 上午&#xff1a;ARM编程模型 下午&#xff1a;常用ARM指令 教学内容&#xff1a; 1、ARM数据类型 字节&#xff08;Byte&#xff09;&#xff1a;在ARM体系结构及常见的…

掌握大语言模型技术: 推理优化

掌握大语言模型技术_推理优化 堆叠 Transformer 层来创建大型模型可以带来更好的准确性、少样本学习能力&#xff0c;甚至在各种语言任务上具有接近人类的涌现能力。 这些基础模型的训练成本很高&#xff0c;并且在推理过程中可能会占用大量内存和计算资源&#xff08;经常性成…

数据结构(队列)

一.什么是队列 1.队列定义 队列是一种特殊的线性表&#xff0c;特殊之处在于他只允许在表的前端(front)进行删除操作&#xff0c;而在表的后端(rear)进行插入操作。和栈一样&#xff0c;队列也是一种操作受限制的线性表。进行插入操作的一端称为队尾&#xff0c;进行删除操作的…

微服务理解篇

一 :架构演变 1 单体架构: 简单理解为一个服务涵盖所有需求功能2 垂直架构: 按照业务功能将单体架构拆分成小模块服务, 如:订单系统,用户系统,商品系统 ##缺点 引入分布式事务,分布式锁等,优点:模块解耦## 垂直拆分:根据业务层级拆分,比如商城的订单系统,用户系统,商品系统…

搭建属于自己本地的网站

1.关闭selinux 1.1 为什么关闭&#xff1f; 如果selinux不关闭的话&#xff0c;修改ssh端口等策略会不生效&#xff0c; 比如向将ssh端口修改为22011&#xff0c;修改后重启sshd服务&#xff0c;端口未修改&#xff0c;此时需要执行setendforce 0 命令&#xff0c;然后再次重…