基于smilehappiness-framework-base,快速集成ShardingSphere JDBC

文章目录

  • 1 前言
  • 2 分库分表
    • 2.1 什么是分库分表
    • 2.2 垂直分库
    • 2.3 水平分表
  • 3 如何集成使用分库分表
    • 3.1 添加maven依赖
    • 3.2 添加 shardingSphere 数据源
    • 3.2 添加 sharding jdbc 配置
      • 3.2.1 分表配置示例
      • 3.2.2 分库且分表配置示例

1 前言

为什么使用分库分表?随着业务量的增加,单表的数据量非常庞大,查询性能会变得非常差,速度非常慢,分库分表可以很友好的解决这个问题。

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

2 分库分表

分库分表的目的是为了解决单表数据量过大的问题,将数据分散到不同的库的不同的表中,从而提高查询效率。当然啦,分库还可以很好的配合读写分离使用,进一步提高系统的性能。

2.1 什么是分库分表

分库分表,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。根据目前社区活跃度,本项目采用
shardingsphere-jdbc 进行分库分表,可以很好的兼容SpringBoot。

使用的组件版本: shardingsphere-jdbc使用的是5.2.1版本,动态数据源使用的是4.2.0版本

  • ShardingSphere
    JDBC(前身称为Sharding-JDBC)并不是包含多个独立组件,而是一个统一的数据库访问层解决方案的组成部分。它是一个轻量级的Java框架,通过提供一套完整的JDBC驱动的方式来透明化分库分表操作,使得用户能够像操作单个数据库一样操作分布式的数据库集群。
  • Sharding-JDBC:最初是指的一个专注于在Java应用中进行数据库分片(sharding)的轻量级框架,通过JDBC驱动扩展的方式实现在应用端的数据库水平扩展能力。

ShardingSphere JDBC:随着项目发展,该项目被纳入到了更广泛的Apache ShardingSphere项目之下,并正式更名为“ShardingSphere
JDBC”,其不仅保留了原有的数据库分片功能,还可能增加了更多如分布式事务、数据治理等企业级特性,成为了Apache
ShardingSphere项目中针对Java应用环境下的一个模块。
所以,现在大家所说的“ShardingSphere JDBC”就是以前“Sharding-JDBC”的延续和发展,具备更强大的功能和更完善的设计。

2.2 垂直分库

垂直分库是指将表中的数据按照一定的规则,将数据分散到不同的库中,通常是按照业务功能划分到不同的数据库中,比如,将用户数据、订单数据、商品数据分别存储到不同的数据库中。

2.3 水平分表

水平分表是指将表中的数据按照一定的规则,将数据分散到表结构相同的,数据量相似的不同的表中。

3 如何集成使用分库分表

3.1 添加maven依赖

在需要使用分库分表的项目中,添加如下依赖:


<parent><groupId>cn.smilehappiness</groupId><artifactId>smilehappiness-framework-base</artifactId><version>3.0.3-RELEASE</version>
</parent>

<dependency><groupId>cn.smilehappiness</groupId><artifactId>smilehappiness-shardingjdbc</artifactId>
</dependency>

3.2 添加 shardingSphere 数据源

为需要使用分库分表的mapper类打上 @DS(“shardingSphere”) 注解添加指定数据源,示例如下:


@DS("shardingSphere")
@Repository
public interface TShardingTestModeMapper extends BaseMapper<TShardingTestMod> {
}

3.2 添加 sharding jdbc 配置

注:查询分表的数据时,需要包含分表的分片键,比如使用biz_id分表,查询数据时,where条件中,需要包含biz_id这个字段,否则将会查询所有的表数据。

3.2.1 分表配置示例

spring:shardingsphere:mode:type: Standaloneprops:sql-show: truedatasource:common:driver-class-name: com.mysql.cj.jdbc.Drivernames: creditcredit:type: com.zaxxer.hikari.HikariDataSourcejdbc-url: jdbc:mysql://ip:port/xxx?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: adminpassword: 666rules:sharding:tables:bpm_process_data_record:actual-data-nodes: credit.bpm_process_data_record_$->{0..19}# 分库策略databaseStrategy:none:# 分表策略table-strategy:standard:sharding-column: biz_idsharding-algorithm-name: bpm-process-data-record-inlinebpm_process_record:actual-data-nodes: credit.bpm_process_record_$->{0..9}table-strategy:standard:sharding-column: biz_idsharding-algorithm-name: bpm-process-record-inlinesharding-algorithms:bpm-process-data-record-inline:type: INLINEprops:algorithm-expression: bpm_process_data_record_$->{Long.parseLong(biz_id) % 20}bpm-process-record-inline:type: INLINEprops:algorithm-expression: bpm_process_record_$->{Long.parseLong(biz_id) % 10}

3.2.2 分库且分表配置示例

spring:shardingsphere:mode:type: Standaloneprops:sql-show: truedatasource:common:driver-class-name: com.mysql.cj.jdbc.Drivernames: db0,db1,db2db0:type: com.zaxxer.hikari.HikariDataSourcejdbc-url: jdbc:mysql://local-mysql.xxx.com:3306/db0?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: javapassword: AtOd5SYDRapIOU2O!NyjL!cMK90db1:type: com.zaxxer.hikari.HikariDataSourcejdbc-url: jdbc:mysql://local-mysql.xxx.com:3306/db1?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: javapassword: AtOd5SYDRapIOU2O!NyjL!cMK90db2:type: com.zaxxer.hikari.HikariDataSourcejdbc-url: jdbc:mysql://local-mysql.xxx.com:3306/db2?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: javapassword: AtOd5SYDRapIOU2O!NyjL!cMK90rules:sharding:tables:t_sharding_test_mod:actual-data-nodes: db$->{0..1}.t_sharding_test_mod_$->{0..2}database-strategy:standard:sharding-column: idsharding-algorithm-name: database-inlinetable-strategy:standard:sharding-column: user_idsharding-algorithm-name: table-inlinet_sharding_time_range:#如果多种时间区间组合,可以使用如下配置方式#actual-data-nodes: db2.t_sharding_time_range_$->{2023}_$->{12},db2.t_sharding_time_range_$->{2024..2025}_$->{(1..12).collect{t ->t.toString().padLeft(2,'0')}}actual-data-nodes: db2.t_sharding_time_range_$->{2024..2025}_$->{(1..12).collect{t ->t.toString().padLeft(2,'0')}}table-strategy:standard:sharding-column: created_timesharding-algorithm-name: time-inlinesharding-algorithms:database-inline:type: INLINEprops:algorithm-expression: db$->{id % 2}table-inline:type: INLINEprops:algorithm-expression: t_sharding_test_mod_$->{user_id % 3}time-inline:type: INTERVALprops:datetime-pattern: "yyyy-MM-dd HH:mm:ss"sharding-suffix-pattern: "yyyy_MM"datetime-lower: "2024-01-01 00:00:00"datetime-upper: "2099-12-30 00:00:00"datetime-interval-amount: 1datetime-interval-unit: MONTHS

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

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

相关文章

【Fastadmin】动态下拉(SelectPage)

目录 1.常规用法: 2.常用属性: 3.联动用法:三级分类为例 FastAdmin中的动态下拉列表使用的是优秀强大的Selectpage插件,FastAdmin对其进行了二次开发。 1.常规用法: <input id="c-name" data-rule="required" data-source="category/sele…

vue3_父组件调用子组件的某个方法

父组件&#xff1a; <template><div class"father"><el-button click"handle">触发子组件事件</el-button><child ref"children"/></div> </template><script setup lang"ts"> impo…

C# OpenCvSharp 颜色反转

目录 效果 灰度图 黑白色反转 彩色反转 项目 代码 下载 效果 灰度图 黑白色反转 彩色反转 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Te…

电机应用中的大功率电阻器?

在这篇文章中&#xff0c;我们将考虑电机应用中的电阻器。 交流、直流和专用电机用于广泛的应用。一些电机应用相对简单&#xff0c;唯一需要关注的是电机的启动和关闭。在这里&#xff0c;成本、简单性和可靠性是主要问题&#xff0c;而电机控制电阻器是常见的解决方案。 在…

【数据结构】B树,B+树,B*树

文章目录 一、B树1.B树的定义2.B树的插入3.B树的中序遍历 二、B树和B*树1.B树的定义2.B树的插入3.B*树的定义4.B树系列总结 三、B树与B树的应用 一、B树 1.B树的定义 1. 在内存中搜索效率高的数据结构有AVL树&#xff0c;红黑树&#xff0c;哈希表等&#xff0c;但这是在内存…

解决:selenium web browser 的版本适配问题

文章目录 解决方案&#xff1a;使用 webdriver manager 自动适配驱动 使用 selenium 操控浏览器的时候报错&#xff1a; The chromedriver version (114.0.5735.90) detected in PATH at /opt/homebrew/bin/chromedriver might not be compatible with the detected chrome ve…

IK分词器

下载 elasticsearch&#xff1a;https://www.elastic.co/cn/elasticsearch elasticsearch-analysis-ik&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik 启动 elasticsearch&#xff1a;elasticsearch\bin\elasticsearch.bat http://localhost:9200 启动 kiban…

AutoSAR(基础入门篇)11.5-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…

C++面试宝典第32题:零钱兑换

题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …

golang 函数式编程库samber/mo使用: Either

golang 函数式编程库samber/mo使用&#xff1a; Either 如果您不了解samber/mo库&#xff0c; 请先阅读第一篇 Option 结构定义 有时候我们不确定值的类型&#xff0c; 一个值可能是int&#xff0c; 也可能是string&#xff0c; 这时候我们可以使用Either类型。 Either类型是…

SQL-Labs靶场“29-31”关通关教程

君衍. 一、二十九关 基于错误的WAF单引号注入1、源码分析2、HTTP参数污染3、联合查询注入4、updatexml报错注入 二、三十关 基于错误的WAF双引号注入1、源码分析2、联合查询注入3、updatexml报错注入 三、三十一关 基于错误的WAF双引号括号注入1、源码分析2、联合查询注入3、up…

【JavaEE】_前端使用GET请求的queryString向后端传参

目录 1. GET请求的query string 2. 关于query string的urlencode 1. GET请求的query string 1. 在HttpServletRequest请求中&#xff0c;getParameter方法用于在服务器这边获取到请求中的参数&#xff0c;主要在query string中&#xff1b; query string中的键值对都是程序…

C#中的关键字params的用法

C#中有一个关键字params&#xff0c;它相对于一些主要关键字来说&#xff0c;还算是较为低频的&#xff0c;但也会用到。我们可以了解和学习下。 一、定义及约束 params关键字的作用在于可以让方法参数的数目可变。 params的参数类型必须是一维数组。 一旦在方法加入了para…

C++ list详解以及模拟实现

目录 1.list的使用 1.1list的定义 1.2list的使用 1.3list iterator使用 1.4list capacity 1.5list element access 1.6list增删查改 2.list迭代器失效问题 3.list的模拟实现 1.list的使用 1.1list的定义 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容…

Redis之Sentinel模式安装文档

下载 官网地址 http://download.redis.io/releases/ 1、环境: 127.0.0.1 127.0.0.2 127.0.0.3 2、创建目录,创建redis用户,解压Redis安装包 mkdir -p /u01/redisgroupadd redisuseradd -g redis redis chown -R redis:redis /u01/redis/ su - redis tar -zxvf redis-5…

【深度学习笔记】4_4 自定义层

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 4.4 自定义层 深度学习的一个魅力在于神经网络中各式各样的层&#xff0c;例如全连接层和后面章节中将要介绍的卷积层、池化层与循环层…

240Hz高刷电竞显示器 - HKC VG253KM

&#x1f389;&#x1f389;&#x1f389; 各位电竞爱好者们&#xff0c;今天给大家带来一款神秘武器&#xff0c;一款能够让你在游戏中大展拳脚的高刷电竞显示器 - HKC VG253KM&#xff01;&#x1f525;&#x1f525;&#x1f525; 这款显示器&#xff0c;哎呀&#xff0c;真…

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…

IP对讲终端SV-6002(防水)

SV-6002&#xff08;防水&#xff09;是一款IP对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;解码后播放&#xff0c;外部DC12~24V电源供电端子&#xff0c;提供单路2W的音频输出。基于TCP/IP网络通信协议和数字音频技术&#xff0c;…

低代码开发如何助力数字化企业管理系统平台构建

随着数字化时代的到来&#xff0c;企业对于管理系统的需求日益增长。高效的管理系统可以提高企业的运作效率&#xff0c;降低成本&#xff0c;提升竞争力。然而&#xff0c;传统的开发方式在应对日益复杂的管理系统需求时&#xff0c;显得力不从心。低代码开发作为一种新兴的开…