ShardingSphere-JDBC快速入门

ShardingSphere-JDBC读写分离快速入门

  • 一、ShardingSphere-JDBC 读写分离
    • 1.创建springboot程序
      • 1.1 添加依赖
      • 1.2 java代码
      • 1.3 配置
    • 2.测试
  • 二、ShardingSphere-JDBC垂直分片
    • 1.创建springboot程序
      • 1.1 导入依赖
      • 1.2 java代码
      • 1.3 配置
    • 2.测试
  • 三、ShardingSphere-JDBC水平分片
    • 1.创建springboot程序
      • 1.1 导入依赖
      • 1.2 java代码
      • 1.3 配置
    • 2.测试

前言:ShardingSphere-JDBC整合springBoot构建项目配置可以参考官方文档:
https://shardingsphere.apache.org/document/5.2.0/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/

一、ShardingSphere-JDBC 读写分离

概念: ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
在这里插入图片描述

1.创建springboot程序

1.1 添加依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.1.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
</dependencies>

1.2 java代码

@TableName("t_user")
@Data
public class User {@TableId(type = IdType.AUTO)private Long id;private String uname;
}@Mapper
public interface UserMapper extends BaseMapper<User> {
}

1.3 配置

配置前提:现有一主两从mysql集群。主从数据库同步已开启,现在有一个数据库db_user,有一张表t_user。

# 应用名称
spring.application.name=sharging-jdbc-demo
# 开发环境设置
spring.profiles.active=dev
# 内存模式
spring.shardingsphere.mode.type=Memory# 配置真实数据源
spring.shardingsphere.datasource.names=master,slave1,slave2# 配置第 1 个数据源
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://192.168.80.1:3306/db_user
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456# 配置第 2 个数据源
spring.shardingsphere.datasource.slave1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.jdbc-url=jdbc:mysql://192.168.80.2:3306/db_user
spring.shardingsphere.datasource.slave1.username=root
spring.shardingsphere.datasource.slave1.password=123456# 配置第 3 个数据源
spring.shardingsphere.datasource.slave2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave2.jdbc-url=jdbc:mysql://192.168.80.3:3306/db_user
spring.shardingsphere.datasource.slave2.username=root
spring.shardingsphere.datasource.slave2.password=123456# 读写分离类型,如: Static,Dynamic
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.type=Static
# 写数据源名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-name=master
# 读数据源名称,多个从数据源用逗号分隔
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-names=slave1,slave2# 负载均衡算法名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.load-balancer-name=alg_round# 负载均衡算法配置
# 负载均衡算法类型
# 轮询
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_round.type=ROUND_ROBIN
# 随机
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_random.type=RANDOM
# 权重
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.type=WEIGHT
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave1=1
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave2=2# 打印SQl
spring.shardingsphere.props.sql-show=true

2.测试

测试结果: 写数据时数据插入master库;读数据时根据配置的负载均衡算法数据从slave节点读取

@SpringBootTest
class ReadwriteTest {@Autowiredprivate UserMapper userMapper;/*** 写入数据的测试*/@Testpublic void testInsert(){User user = new User();user.setUname("张三丰");userMapper.insert(user);}/*** 读数据测试*/@Testpublic void testSelectAll(){List<User> users = userMapper.selectList(null);List<User> users = userMapper.selectList(null);//执行第二次测试负载均衡users.forEach(System.out::println);}}

注意: 为了保证主从库间的事务一致性,避免跨服务的分布式事务,ShardingSphere-JDBC的主从模型中,事务中的数据读写均用主库

  • 不添加@Transactional:insert对主库操作,select对从库操作
  • 添加@Transactional:则insert和select均对主库操作

二、ShardingSphere-JDBC垂直分片

1.创建springboot程序

1.1 导入依赖

依赖同上面的配置一样

1.2 java代码

@TableName("t_order")
@Data
public class Order {@TableId(type = IdType.AUTO)private Long id;private String orderNo;private Long userId;private BigDecimal amount;
}@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}@TableName("t_user")
@Data
public class User {@TableId(type = IdType.AUTO)private Long id;private String uname;
}@Mapper
public interface UserMapper extends BaseMapper<User> {
}

1.3 配置

配置前提: 假设现在微服务进行了拆分,有user-service、order-service服务,微服务架构下,不同的服务有自己的数据库。所以现在有两个数据库db_user、db_order。db_user数据库有一张表t_user,db_order数据库有一张表t_order。

# 应用名称
spring.application.name=sharding-jdbc-demo
# 环境设置
spring.profiles.active=dev# 配置真实数据源
spring.shardingsphere.datasource.names=user-service,order-service# 配置第 1 个数据源
spring.shardingsphere.datasource.user-service.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.user-service.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.user-service.jdbc-url=jdbc:mysql://192.168.80.4:3306/db_user
spring.shardingsphere.datasource.user-service.username=root
spring.shardingsphere.datasource.user-service.password=123456# 配置第 2 个数据源
spring.shardingsphere.datasource.server-order.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.order-service.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.order-service.jdbc-url=jdbc:mysql://192.168.80.5:3306/db_order
spring.shardingsphere.datasource.order-service.username=root
spring.shardingsphere.datasource.order-service.password=123456# 标准分片表配置(数据节点)
# spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes=值
# 值由数据源名 + 表名组成,以小数点分隔。
# <table-name>:逻辑表名
spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=user-service.t_user
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=order-service.t_order# 打印SQL
spring.shardingsphere.props.sql-show=true

2.测试

测试结论: :查询t_user数据从user-service数据库查询,查询t_order数据从order-service数据库查询

@SpringBootTest
public class ShardingTest {@Autowiredprivate UserMapper userMapper;@Autowiredprivate OrderMapper orderMapper;/*** 垂直分片:插入数据测试*/@Testpublic void testInsertOrderAndUser(){User user = new User();user.setUname("强哥");userMapper.insert(user);Order order = new Order();order.setOrderNo("ATGUIGU001");order.setUserId(user.getId());order.setAmount(new BigDecimal(100));orderMapper.insert(order);}/*** 垂直分片:查询数据测试*/@Testpublic void testSelectFromOrderAndUser(){User user = userMapper.selectById(1L);Order order = orderMapper.selectById(1L);}
}

三、ShardingSphere-JDBC水平分片

1.创建springboot程序

1.1 导入依赖

依赖同上面的配置一样

1.2 java代码

@TableName("t_order")
@Data
public class Order {@TableId(type = IdType.AUTO)private Long id;private String orderNo;private Long userId;private BigDecimal amount;
}@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}@TableName("t_user")
@Data
public class User {@TableId(type = IdType.AUTO)private Long id;private String uname;
}@Mapper
public interface UserMapper extends BaseMapper<User> {
}

1.3 配置

配置前提: 假设现在订单量过大,我们将订单库再增加一个。即一个db_user数据库,两个db_order数据库

#========================基本配置
# 应用名称
spring.application.name=sharging-jdbc-demo
# 开发环境设置
spring.profiles.active=dev
# 内存模式
spring.shardingsphere.mode.type=Memory
# 打印SQl
spring.shardingsphere.props.sql-show=true#========================数据源配置
# 配置真实数据源
spring.shardingsphere.datasource.names=user-service,order-service0,order-service1# 配置第 1 个数据源
spring.shardingsphere.datasource.user-service.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.user-service.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.user-service.jdbc-url=jdbc:mysql://192.168.80.6:3306/db_user
spring.shardingsphere.datasource.user-service.username=root
spring.shardingsphere.datasource.user-service.password=123456# 配置第 2 个数据源
spring.shardingsphere.datasource.order-service0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.order-service0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.order-service0.jdbc-url=jdbc:mysql://192.168.80.7:3306/db_order
spring.shardingsphere.datasource.order-service0.username=root
spring.shardingsphere.datasource.order-service0.password=123456# 配置第 3 个数据源
spring.shardingsphere.datasource.order-service1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.order-service1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.order-service1.jdbc-url=jdbc:mysql://192.168.80.8:3306/db_order
spring.shardingsphere.datasource.order-service1.username=root
spring.shardingsphere.datasource.order-service1.password=123456#------------------------标准分片表配置(数据节点配置)
# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
# 缺省表示使用已知数据源与逻辑表名称生成数据节点,用于广播表(即每个库中都需要一个同样的表用于关联查询,多为字典表)或只分库不分表且所有库的表结构完全一致的情况
spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=user-service.t_user
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=order-service$->{0..1}.t_order$->{0..1}#------------------------基于user_id进行分库基于order_no进行分表
#------------------------分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
# 用于单分片键的标准分片场景
# 分片列名称
spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-column=user_id
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-algorithm-name=alg_mod#------------------------分表策略
# 用于单分片键的标准分片场景
# 分片列名称
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=order_no
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=alg_hash_mod#------------------------分片算法配置
# 行表达式分片算法
# 分片算法类型
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline_userid.type=INLINE
# 分片算法属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline_userid.props.algorithm-expression=order-service$->{user_id % 2}# 取模分片算法
# 分片算法类型
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.type=MOD
# 分片算法属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.props.sharding-count=2# 哈希取模分片算法
# 分片算法类型
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.type=HASH_MOD
# 分片算法属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.props.sharding-count=2#------------------------分布式序列策略配置
# 分布式序列列名称
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=id
# 分布式序列算法名称
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=alg_snowflake#------------------------分布式序列算法配置
# 分布式序列算法类型
spring.shardingsphere.rules.sharding.key-generators.alg_snowflake.type=SNOWFLAKE

2.测试

测试结论:
1.数据插入:基于user_id进行分库user_id为奇数插入order-service1,user_id为偶数插入order-service0, 基于order_no进行分表也是同样逻辑。
2.数据查询:我们只需要操作t_order表,ShardingSphere-JDBC会自动从两个库的表中查询结果合并在一起

    /*** 水平分片:分表插入数据测试*/@Testpublic void testInsertOrderTableStrategy(){for (long i = 1; i < 5; i++) {Order order = new Order();order.setOrderNo("order" + i);order.setUserId(1L);order.setAmount(new BigDecimal(100));orderMapper.insert(order);}for (long i = 5; i < 9; i++) {Order order = new Order();order.setOrderNo("order" + i);order.setUserId(2L);order.setAmount(new BigDecimal(100));orderMapper.insert(order);}}/*** 水平分片:查询所有记录* 查询了两个数据源,每个数据源中使用UNION ALL连接两个表*/@Testpublic void testShardingSelectAll(){List<Order> orders = orderMapper.selectList(null);orders.forEach(System.out::println);}/*** 水平分片:根据user_id查询记录* 查询了一个数据源,每个数据源中使用UNION ALL连接两个表*/@Testpublic void testShardingSelectByUserId(){QueryWrapper<Order> orderQueryWrapper = new QueryWrapper<>();orderQueryWrapper.eq("user_id", 1L);List<Order> orders = orderMapper.selectList(orderQueryWrapper);orders.forEach(System.out::println);}

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

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

相关文章

WPForms Pro插件下载:简化您的在线表单构建,提升用户互动

在当今的数字化世界中&#xff0c;表单是网站与用户互动的关键。无论是收集信息、处理订单还是进行调查&#xff0c;一个好的表单可以极大地提升用户体验和转化率。WPForms Pro插件&#xff0c;作为一款专业的WordPress表单构建工具&#xff0c;旨在帮助您轻松创建美观、功能强…

MySQL无法打开情况下读取frm文件的表结构

一、背景&#xff1a; 开发人员通过MySQL客户端工具&#xff0c;可以访问MySQL5.7.6&#xff0c;可以访问具体的DB&#xff0c;可以查看小写表的数据&#xff0c;但是无法查看大写表的数据&#xff0c;报错信息为“table does not exist”。 二、检查与分析&#xff1a; ssh登录…

mac如何通过Teminal查找本机ip地址

方法1 ifconfig ifconfig终端中使用 ifconfig 可以查看本地 ip 但是看到的信息太多了&#xff0c;我们只是想要一个本机ip而已 方法2 ifconfig en0 ifconfig en0相比方法1我们算是直接获取到了本机ip&#xff0c;但是第一眼看到还是需要反应一段时间 方法3 精准获取IP ifcon…

跑腿业务和支付业务的具体实现流程

校园云项目 跑腿业务的具体业务分析 该流程适用于很多接单相关的业务场景&#xff0c;或多或少都可以从中得到启发&#xff1b; 整个流程描述&#xff1a; 任务发布&#xff1a; 用户在平台上发布任务&#xff0c;描述需要完成的任务内容&#xff0c;包括取件地址、送达地址…

基于文件流操作文件系统

stream 文件流ScannerWriter遍历目录删除指定文件把目标文件复制为源文件小结 文件流 文件的内容本质上都是来自于硬盘,而硬盘由操作系统管理. 使用java来操作文件,就要用到java的api.这里涉及一系列的类: 字节流: InputStream和OutputStream是以操作字节为单位(二进制文件). …

MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

pytorch-解决过拟合之regularization

目录 1.解决过拟合的方法2. regularization2. regularization分类3. pytorch L2 regularization4. 自实现L1 regularization5. 完整代码 1.解决过拟合的方法 更多的数据降低模型复杂度 regularizationDropout数据处理早停止 2. regularization 以二分类的cross entropy为例&…

YesPMP众包平台最新项目

YesPMP一站式互联网众包平台&#xff0c;最新外包项目&#xff0c;有感兴趣的用户可进入平台参与竞标。 &#xff08;竞标后由项目方直接与服务商联系&#xff0c;双方直接对接&#xff09; 1.查看项目&#xff1a;个人技术-YesPMP平台 2.查看项目&#xff1…

运维 kubernetes(k8s)基础学习

一、容器相关 1、发展历程&#xff1a;主机–虚拟机–容器 主机类似别墅的概念&#xff0c;一个地基上盖的房子只属于一个人家&#xff0c;很多房子会空出来&#xff0c;资源比较空闲浪费。 虚拟机类似楼房&#xff0c;一个地基上盖的楼房住着很多人家&#xff0c;相对主机模式…

大数据学习第四天

文章目录 yaml 三大组件的方式交互流程hive 使用安装mysql(hadoop03主机)出现错误解决方式临时密码 卸载mysql (hadoop02主机)卸载mysql(hadoop01主机执行)安装hive上传文件解压解决版本差异修改hive-env.sh修改 hive-site.xml上传驱动包初始化元数据在hdfs 创建hive 存储目录启…

人工智能基础-Python之Pandas库教程

文章目录 前言一、Pandas是什么&#xff1f;二、使用步骤1.引入库2.数据读取2.1 数据类型2.2 数据读取1.常见操作2.txt读取 3.pandas的数据结构3.1 Series1.属性2.创建Series3.查询 3.2 DataFrame1.创建DataFrame 4.查询数据4.1 data.loc 根据行列标签值进行查询1.使用单个labe…

javaWeb项目-社区医院管理服务系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java技术 Java语…

机器学习中常见的数据分析,处理方式(以泰坦尼克号为例)

数据分析 读取数据查看数据各个参数信息查看有无空值如何填充空值一些特殊字段如何处理读取数据查看数据中的参数信息实操具体问题具体分析年龄问题 重新划分数据集如何删除含有空白值的行根据条件删除一些行查看特征和标签的相关性 读取数据 查看数据各个参数信息 查看有无空…

【iOS开发】(六)react Native 路由嵌套传参与框架原理(完)20240423

【iOS开发】(六)react Native 路由嵌套传参与框架原理&#xff08;完&#xff09;20240423 感谢拉钩教育的教学。 &#xff08;五&#xff09;我们介绍了四种路由导航&#xff0c;这一节我们介绍他们的嵌套传参和框架的整体原理。到这里&#xff0c;大家已经能用RN框架进行一些…

电商价格监测的价值是什么

品牌做电商价格监测的原因多是为了渠道管控&#xff0c;即控价&#xff0c;管控价格前需要对渠道中的价格数据进行监测&#xff0c;通过监测价格&#xff0c;对渠道中低价数据进行全面的了解&#xff0c;如有授权低价率&#xff0c;非授权低价率&#xff0c;非授权低价店铺的总…

python与上位机开发day02

1.常见运算符 1.1 赋值运算符 赋值运算符主要用来对变量进行赋值,包括如下这些: 运算符描述赋值加等于-减等于*乘等于/除等于//整除等于%模等于**幂等于 实例如下: a 10 a 5 # 等价于 a a5 a *2 # 等价于 a a*21.2 比较运算符 比较运算符主要用来比较两个数据的大小…

Windows 搭建自己的大模型-通义千问

1、安装 pytorch https://pytorch.org/get-started/locally/ 点击进入官网&#xff0c;如图选择自己的环境得到pip安装依赖的命令&#xff1a; pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu 2、拉取代码并安…

QA测试开发工程师面试题满分问答20: 软件的安全性应从哪几个方面去测试?

软件的安全性测试应从多个方面进行&#xff0c;并确保覆盖以下关键方面&#xff1a; 当回答问题时&#xff0c;可以根据自己的经验和知识&#xff0c;从上述要点中选择适合的方面进行详细说明。强调测试的综合性、全面性和持续性&#xff0c;并强调测试的重要性以及如何与开发团…

AIGC-stable-diffusion(文本生成图片)+PaddleHub/HuggingFace

功能 stable-diffusion(文本生成图片)PaddleHub&#xff0c;HuggingFace两种调用方式 PaddleHub 环境 pip install paddlepaddle-gpu pip install paddlehub 代码 from PIL import Image import paddlehub as hub module hub.Module(namestable_diffusion)## 保存在demo…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口&#xff0c;它表示一个类能够感知到&#xff08;aware of&#xff09;Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…