当前位置: 首页 > wzjs >正文

网络销售型网站有哪些个人发布信息免费推广平台

网络销售型网站有哪些,个人发布信息免费推广平台,免费的在线设计网站,推广员是做什么的大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注实战代码系列最新文章😉C实现图书管理系统(Qt C GUI界面版)SpringBoot实战系列🐷【SpringBoot实战系列】Sharding-Jdbc实现分库…
大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷【SpringBoot实战系列】Sharding-Jdbc实现分库分表到分布式ID生成器Snowflake自定义wrokId实战
环境搭建大集合环境搭建大集合(持续更新)
分库分表分库分表下的 ID 冲突问题与雪花算法讲解

前情摘要:

1、数据库性能优化
2、分库分表之优缺点分析
3、分库分表之数据库分片分类
4、分库分表之策略
5、分库分表技术栈讲解-Sharding-JDBC
6、分库分表下的 ID 冲突问题与雪花算法讲解

本文章目录

  • 分库分表之实战-sharding-JDBC
    • 一、SpringBoot2.5+MybatisPlus+Sharding-Jdbc项目创建
      • 1. 在创建好的Maven项目的pom文件中添加以下pom文件依赖:
      • 2. 创建对应测试的数据库表
      • 3、创建实体类以及对应数据库实体类
    • 二、 Sharding-Jdbc常规数据源配置和水平分表
      • 配置appliaction.properties
      • ShardingSphere SQL 执行日志解析
        • 1. Logic SQL(逻辑 SQL)
        • 2. Actual SQL(实际 SQL)
        • 3. 绑定参数(实际参数值)
        • 4. 分片路由逻辑分析
    • 三、分库分表下的 ID 冲突问题解决

分库分表之实战-sharding-JDBC

一、SpringBoot2.5+MybatisPlus+Sharding-Jdbc项目创建

1. 在创建好的Maven项目的pom文件中添加以下pom文件依赖:

<properties><java.version>11</java.version><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><spring.boot.version>2.5.5</spring.boot.version><mybatisplus.boot.starter.version>3.4.0</mybatisplus.boot.starter.version><lombok.version>1.18.16</lombok.version><sharding-jdbc.version>4.1.1</sharding-jdbc.version><junit.version>4.12</junit.version><druid.version>1.1.16</druid.version><!--跳过单元测试--><skipTests>true</skipTests></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>${spring.boot.version}</version><scope>test</scope></dependency><!--mybatis plus和springboot整合--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatisplus.boot.starter.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>${sharding-jdbc.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring.boot.version}</version><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins></build>

2. 创建对应测试的数据库表

  • 新建数据库ccc_shop_order_0
CREATE DATABASE `ccc_shop_order_0` 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_bin;
  • 新建数据库ccc_shop_order_1
CREATE DATABASE `ccc_shop_order_1` 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_bin;
  • 在数据库ccc_shop_order_0中新建表product_order_0、product_order_1
 use ccc_shop_order_0;CREATE TABLE `product_order_0` (`id` bigint NOT NULL AUTO_INCREMENT,`out_trade_no` varchar(64) DEFAULT NULL COMMENT '订
单唯⼀标识',`state` varchar(11) DEFAULT NULL COMMENT 'NEW 未⽀
付订单,PAY已经⽀付订单,CANCEL超时取消订单',`create_time` datetime DEFAULT NULL COMMENT '订单⽣
成时间',`pay_amount` decimal(16,2) DEFAULT NULL COMMENT '订
单实际⽀付价格',`nickname` varchar(64) DEFAULT NULL COMMENT '昵称',`user_id` bigint DEFAULT NULL COMMENT '⽤户id',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_bin;CREATE TABLE `product_order_1` (`id` bigint NOT NULL AUTO_INCREMENT,`out_trade_no` varchar(64) DEFAULT NULL COMMENT '订
单唯⼀标识',`state` varchar(11) DEFAULT NULL COMMENT 'NEW 未⽀
付订单,PAY已经⽀付订单,CANCEL超时取消订单',`create_time` datetime DEFAULT NULL COMMENT '订单⽣
成时间',`pay_amount` decimal(16,2) DEFAULT NULL COMMENT '订
单实际⽀付价格',`nickname` varchar(64) DEFAULT NULL COMMENT '昵称',`user_id` bigint DEFAULT NULL COMMENT '⽤户id',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_bin;
  • 在数据库ccc_shop_order_1中新建表product_order_0、product_order_1
use ccc_shop_order_1;CREATE TABLE `product_order_0` (`id` bigint NOT NULL AUTO_INCREMENT,`out_trade_no` varchar(64) DEFAULT NULL COMMENT '订
单唯⼀标识',`state` varchar(11) DEFAULT NULL COMMENT 'NEW 未⽀
付订单,PAY已经⽀付订单,CANCEL超时取消订单',`create_time` datetime DEFAULT NULL COMMENT '订单⽣
成时间',`pay_amount` decimal(16,2) DEFAULT NULL COMMENT '订
单实际⽀付价格',`nickname` varchar(64) DEFAULT NULL COMMENT '昵称',`user_id` bigint DEFAULT NULL COMMENT '⽤户id',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_bin;CREATE TABLE `product_order_1` (`id` bigint NOT NULL AUTO_INCREMENT,`out_trade_no` varchar(64) DEFAULT NULL COMMENT '订
单唯⼀标识',`state` varchar(11) DEFAULT NULL COMMENT 'NEW 未⽀
付订单,PAY已经⽀付订单,CANCEL超时取消订单',`create_time` datetime DEFAULT NULL COMMENT '订单⽣
成时间',`pay_amount` decimal(16,2) DEFAULT NULL COMMENT '订
单实际⽀付价格',`nickname` varchar(64) DEFAULT NULL COMMENT '昵称',`user_id` bigint DEFAULT NULL COMMENT '⽤户id',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_bin;

3、创建实体类以及对应数据库实体类

ProductOrderDO

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("product_order")
public class ProductOrderDO {@TableId(value = "id", type = IdType.AUTO)private Long id;private String outTradeNo;private String state;private Date createTime;private Double payAmount;private String nickname;private Long userId;
}

ProductOrderMapper

public interface ProductOrderMapper extendsBaseMapper<ProductOrderDO> {
}

目前我的工程如下,大家可以对比一下
在这里插入图片描述

二、 Sharding-Jdbc常规数据源配置和水平分表

配置appliaction.properties

spring.application.name=ccc-sharding-jdbc
server.port=8080
# 打印执⾏的数据库以及语句
spring.shardingsphere.props.sql.show=true
# 数据源 db0,如果有多个用逗号分隔,有多少个,下面具体数据库就要配置多少个
spring.shardingsphere.datasource.names=ds0,ds1
# 第⼀个数据库
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://127.0.0.1:3306/ccc_shop_order_0?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=123456# 第二个数据库
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://127.0.0.1:3306/ccc_shop_order_1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=123456# 指定product_order表的数据分布情况,配置数据节点,⾏表达式标识符使⽤ ${...} 或 $->{...},但前者与 Spring 本身的⽂件占位符冲突,所以在 Spring 环境中建议使⽤ $->{...}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds0.product_order_$->{0..1}
# 指定product_order表的分⽚策略,分⽚策略包括【分⽚键和分⽚算法】
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{user_id % 2}

这里我们使用的是mysql8.0

  1. spring.shardingsphere.datasource.ds0.password=123456 这里大家记得修改为自己数据库的密码
  2. spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://127.0.0.1:3306/ccc_shop_order_0?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 这里大家记得把ip改为自己的安排(如果数据库不在本地)

ShardingSphere SQL 执行日志解析

编写单元测试DbTest

@RunWith(SpringRunner.class)  //底层⽤junitSpringJUnit4ClassRunner
@SpringBootTest(classes = DemoApplication.class)
@Slf4j
public class DbTest {@Autowiredprivate ProductOrderMapper productOrderMapper;@Testpublic void testSaveProductOrder(){for(int i=0;i<10;i++){ProductOrderDO productOrder = new ProductOrderDO();productOrder.setCreateTime(new Date());productOrder.setNickname("ccc_i="+i);productOrder.setOutTradeNo(UUID.randomUUID().toString().substring(0,32));productOrder.setPayAmount(100.00);productOrder.setState("PAY");productOrder.setUserId(Long.valueOf(i+""));productOrderMapper.insert(productOrder);}}
}

执行结果如下
在这里插入图片描述

我们查看控制台输出,展示了从逻辑 SQL 到实际 SQL 的路由过程。我来逐行解释:

1. Logic SQL(逻辑 SQL)
INSERT INTO product_order (out_trade_no, state, create_time, pay_amount, nickname, user_id) 
VALUES (?, ?, ?, ?, ?, ?)

这是应用程序实际执行的 SQL 语句:

  • 操作对象:product_order 表(逻辑表名)
  • 参数占位符:? 代表实际参数会在执行时传入
2. Actual SQL(实际 SQL)
ds0 ::: INSERT INTO product_order_0 (out_trade_no, state, create_time, pay_amount, nickname, user_id) 
VALUES (?, ?, ?, ?, ?, ?)

这是 ShardingSphere 根据分片规则路由后实际执行的 SQL:

  • ds0:目标数据源(数据库实例)
  • product_order_0:物理表名
  • 可以看到,逻辑表 product_order 被路由到了物理表 product_order_0
3. 绑定参数(实际参数值)
::: [d861e3e2-720a-4d16-bb67-12f96d31, PAY, 2025-06-30 16:24:23.075, 100.0, ccc_i=0, 0]

这些是占位符 ? 对应的实际参数值:

  1. out_trade_no: d861e3e2-720a-4d16-bb67-12f96d31(交易号)
  2. state: PAY(支付状态)
  3. create_time: 2025-06-30 16:24:23.075(创建时间)
  4. pay_amount: 100.0(支付金额)
  5. nickname: ccc_i=0(用户昵称)
  6. user_id: 0(用户ID,分片键)
4. 分片路由逻辑分析

根据我们之前的配置:

spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{user_id % 2}

user_id=0 时:

  • 0 % 2 = 0 → 路由到 product_order_0
  • 所以这条记录被写入 ds0 库的 product_order_0

三、分库分表下的 ID 冲突问题解决

在 分库分表下的 ID 冲突问题与雪花算法讲解中,我们提到了,同时我们前面的结果表明使用的时候,也确实存在ID冲突问题。因此我们需要使用雪花算法解决这个问题。

  • 方式⼀
    订单id使用MybatisPlus的配置,ProductOrder类配置@TableId(value = “id”, type = IdType.ASSIGN_ID)默认实现类为DefaultIdentifierGenerator雪花算法
    在这里插入图片描述
  • 方式⼆
    使⽤Sharding-Jdbc配置⽂件,注释DO类里面的id分配策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=idspring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE

这里我使用的是方式2,让我们再重新运行测试函数,查看结果
在这里插入图片描述

觉得有用请点赞收藏!
如果有相关问题,欢迎评论区留言讨论~

http://www.dtcms.com/wzjs/794899.html

相关文章:

  • 老哥们给个手机能看的2020seo哪个软件好
  • 网站首页轮播图怎么做的wordpress英文主题破解版
  • 温州网站维护工作手机版oa办公软件
  • 免费做网站. 优帮云做哪些网站可以赚钱的
  • 湖南建设厅官方网站x域名免费网站
  • 怎么才能访问自己做的网站模版网站有源代码吗
  • 做网站服务器电脑配置wordpress可以移动端
  • 网站建设项目及费用湖南长沙网络公司有哪些
  • 网站建设作品图片网站优化推广是什么
  • 网站内容优化方法有哪些内容四平网站seo
  • 山东省住房建设厅网站网站意识形态建设
  • 网站改版建议书建站公司有哪些服务
  • 杭州市建设银行网站松岗网站建设
  • 怎么用linux做网站服务器吗服务网站 建设原则
  • 厂房建设招标网站app下载汅api免费安卓
  • 推荐十个网站财经网站建设
  • 营销型网站建设制作多少钱传统软件开发流程
  • 金华网站建设公司哪家好湖南响应式网站建设哪家有
  • 做网络推广选择哪个网站好虎牙网页游戏大厅
  • 建设部网站如何下载规范 标准懒人建站
  • 创建网站根目录高端企业网站报价
  • php网站项目一起装修网北京总部官网
  • 网站开发合同 中英文网站平均停留时间
  • 中国十大做网站公司wordpress部署云
  • 西安网站网页设计中国机械采购网
  • 北京模板开发建站wordpress全站静态页面
  • 网站推广怎么做优化页面模板参数错误
  • 用c 做的网站怎么打开网络系统管理与维护电大考试题
  • 百度站长工具seo查询网站关键词优化排名公司
  • 湖南省住房与城乡建设厅网站五百丁简历模板官方网站