springboot整合ShardingSphere分库分表并插入1kw条记录

目录

一,数据分片

二,水平分片

三,创建数据库表

四,springboot项目导入依赖

五,创建类

六,bug


bug放到最后了。

一,数据分片

数据分片指按照某个维度将存放在单一数据库中的数据分散地存放至多个数据库或表中以达到提升性能瓶颈以及可用性的效果。 数据分片的有效手段是对关系型数据库进行分库和分表。分库和分表均可以有效的避免由数据量超过可承受阈值而产生的查询瓶颈。

除此之外,分库还能够用于有效的分散对数据库单点的访问量;分表虽然无法缓解数据库压力,但却能够提供尽量将分布式事务转化为本地事务的可能,一旦涉及到跨库的更新操作,分布式事务往往会使问题变得复杂。 使用多主多从的分片方式,可以有效的避免数据单点,从而提升数据架构的可用性。

通过分库和分表进行数据的拆分来使得各个表的数据量保持在阈值以下,以及对流量进行疏导应对高访问量,是应对高并发和海量数据系统的有效手段。 数据分片的拆分方式又分为垂直分片和水平分片。

二,水平分片

水平分片又称为横向拆分。 相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。 例如:根据主键分片,偶数主键的记录放入 0 库(或表),奇数主键的记录放入 1 库(或表),如下图所示。

三,创建数据库表

创建两个数据库,分别为ds00,ds01。两个库中分别放下面三张表。

CREATE TABLE `t_order_0` (`id` bigint(20) NOT NULL,`name` varchar(255) DEFAULT NULL COMMENT '名称',`type` varchar(255) DEFAULT NULL COMMENT '类型',`gmt_create` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;CREATE TABLE `t_order_1` (`id` bigint(20) NOT NULL,`name` varchar(255) DEFAULT NULL COMMENT '名称',`type` varchar(255) DEFAULT NULL COMMENT '类型',`gmt_create` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;CREATE TABLE `t_order_2` (`id` bigint(20) NOT NULL,`name` varchar(255) DEFAULT NULL COMMENT '名称',`type` varchar(255) DEFAULT NULL COMMENT '类型',`gmt_create` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

四,springboot项目导入依赖

全放上来了。

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- shardingsphere --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.0</version></dependency><!-- 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>

五,创建类

service层

public interface OrderService extends IService<Order> {
}
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
}

entity层

@Data
@TableName("t_order")
public class Order {@TableId(type = IdType.AUTO)Long id;String name;String type;Date gmtCreate;
}

多线程插入1kw条数据。

这里我想用线程池来着,但是不知道为啥就是插不进去。然后就只好用了其他写法。

@SpringBootTest
public class DemoApplicationTests {@AutowiredOrderService orderService;@Testpublic void testabs(){int num = 2000;CountDownLatch latch = new CountDownLatch(1);List<Order> orderList = new ArrayList<>();new Thread(() -> {for (long i = 1; i <= 10000000; i++) {Order order = new Order();order.setId(i);order.setName("xxx" + i);order.setType("xxx");order.setGmtCreate(new Date());orderList.add(order);}latch.countDown();}).start();try {latch.await();} catch (InterruptedException e) {}//2000条为一批,插入1000万条List<List<Order>> partition = Lists.partition(orderList, num);partition.stream().forEach(orders -> {orderService.saveBatch(orders);System.err.println("插入数据成功,rows:" + num);});}}

整个添加的过程时间有点长,大概是15分钟左右。

插入完成,查看数据库,他是按照id平均分布的,最终每张表数据量差不多是160w+

六,bug

Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

这个是纯试出来的。

原因是我的pom.xml文件里有一个Druid的依赖,启动的时候一直启不起来,然后我把这个注掉,然后就没事了,看这篇博客shardingsphere+druid 报错roperty ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_shardingsphere property 'sqlsessionfactory' or 'sq-CSDN博客。

<!--        <dependency>-->
<!--            <groupId>com.alibaba</groupId>-->
<!--            <artifactId>druid-spring-boot-starter</artifactId>-->
<!--            <version>1.1.10</version>-->
<!--        </dependency>-->

第二个就是在插入数据的时候,一直报插入匹配多个data nodes,可是并没有啊???

下面我自己写的批量插入的sql:

    <!-- 批量插入 --><insert id="batchInsert" parameterType="list">insert into t_order (`name`,`type`,`gmt_create`)values <foreach collection="orderList" item="item" separator=",">(#{item.name},#{item.type},now())</foreach></insert>

找半天我发现可能是,sql语句里面必须有指定分库分表的字段在里面,这个例子用的是id,那sql语句里面也得是有明确的id,然后我就在new的时候设置了他的id。然后暂时不报错了。

---o(╥﹏╥)o---

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

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

相关文章

鸿蒙TypeScript 开发学习第9天:【TypeScript Number】

1、TypeScript Number TypeScript 与 JavaScript 类似&#xff0c;支持 Number 对象。 Number 对象是原始数值的包装对象。 语法 var num new Number(value);复制注意&#xff1a; 如果一个参数值不能转换为一个数字将返回 NaN (非数字值)。 2、Number 对象属性 下表列出…

HCIA-Datacom H12-811 题库补充(4/7)

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 共享介质型网络使用哪一种技术进行数据转发&#xff1f; A&#xff1a;CDMA/CD B&#xff1a;CSMA/AC C&#xff1a;TDMA/CD D&#xff1a;CSMA/CD 答案&#xff1a;D 解析&#xff1a;以太网 CSMA …

【数据结构】红黑树详解

目录 前言&#xff1a; 红黑树的概念&#xff1a; 红黑树的性质: 红黑树节点的定义&#xff1a; 红黑树的插入&#xff1a; 情况1&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红 情况2&#xff1a;cur为红&#xff0c;p为红&#xff0c…

【每日刷题】Day4

【每日刷题】Day4 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 83. 删除排序链表中的重复元素 - 力扣&#xff08;LeetCode&#xff09; 2. 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&…

数据可视化高级技术Echarts(快速上手柱状图进阶操作)

目录 1.Echarts的配置 2.程序的编码 3.柱状图的实现&#xff08;入门实现&#xff09; 相关属性介绍&#xff08;进阶&#xff09;&#xff1a; 1.标记最大值/最小值 2.标记平均值 3.柱的宽度 4. 横向柱状图 5.colorBy series系列&#xff08;需要构造多组数据才能实现…

shopee虾皮运营技巧,学会这几招能有效提高销量

在电商的运营过程中&#xff0c;新手总会踩上不少的坑&#xff0c;运气好的累计成经验值&#xff0c;应用于日后的店铺运营中&#xff0c;运气不好的&#xff0c;进坑了就再也爬不上来了&#xff0c;特别是跨境电商&#xff0c;本身与国内电商存在很大的信息差&#xff0c;不可…

Windows SDK(六)组合框与列表框控件

组合框和列表框同样也是控件&#xff0c;所以我们在应用组合框和列表框时同样也需要父窗口&#xff0c;现在我们以 创建项目时程序自行创建的窗口作为父窗口展开如下的控件创建与应用 在进行组合框与列表框的讲解前&#xff0c;我们首先在程序中定义几个宏作为我们在编写程序…

C++可变参数模板

可变参数模板 一个可变参数模板就是一个接受可变数目参数的模板函数或模板类。 可变数目的参数被称为参数包。 存在两种参数包&#xff1a; 模板参数类&#xff0c;表示零个或多个模板参数&#xff1b;函数参数包&#xff0c;表示零个或多个函数参数。 我们用一个省略号来…

CVE漏洞是什么,如何对其进行针对性的防护

CVE&#xff08;Common Vulnerabilities and Exposures&#xff09;漏洞是一个网安技术术语&#xff0c;用于描述和标识信息安全领域的已知漏洞和安全风险。CVE是一个公开的列表或数据库&#xff0c;它为各种公开知晓的信息安全漏洞和风险提供了标准化的名称。 每个CVE标识符都…

监控员工电脑的方法有哪些,七种有效的措施

堡垒往往是从内部攻破的&#xff0c;很多企业信息的泄密就是内部员工泄露的&#xff0c;内部泄密占到了企业泄密的八成因素&#xff0c;那么企业能不能监控员工的电脑呢&#xff1f;有什么有效的办法呢&#xff1f; 1. 安装监控软件 屏幕监控软件&#xff1a;此类软件可以实时捕…

Redis群集模式

目录 一、集群的作用 二、Redis集群的数据分片 三、集群的工作原理​编辑 四、搭建Redis群集模式 1.准备环境 1.1 首先安装redis 1.2 在etc下创建redis 1.3再在redis中创建redis-cluster/redis600{1..6}文件 1.4 做个for循环 1.5 开启群集功能 1.6启动redis节点 1.…

汇编语言:寻址方式在结构化数据访问中的应用——计算人均收入

有一年多没有在CSDN上发博文了。人的工作重心总是有转移的&#xff0c;庆幸一直在做着有意义的事。   今天的内容&#xff0c;是为汇编语言课程更新一个实验项目。      本方案修改自王爽编《汇编语言》第&#xff14;版P172“实验7寻址方式在结构化数据访问中的应用” …