热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql–使用shardingsphere实现分库分表

一.简介本节将继续通过ShardingSphere实现分库分表上一节的分表中已经介绍过了使用的分表策略,接下来介绍一下分库策略ShardingSphere提供如下四种分库策略:1.

一.简介

本节将继续通过ShardingSphere实现分库分表


上一节的分表中已经介绍过了使用的分表策略,接下来介绍一下分库策略

ShardingSphere提供如下四种分库策略:

1. standard: #用于单分片键的标准分片场景

2. complex: #用于多分片键的复合分片场景

3. inline: #行表达式分片策略

4. hint: #Hint分片策略

本篇文章使用的是inline行表达式分片策略

关于各种分片策略,可以到手册进行查看



 二.数据库设计


本篇文章使用两个数据库,每个数据库两张表进行简单的演示。

ds0库:

 

 ds1库于ds0两个库数据结构一致



三.编码阶段


1. 引入主要依赖

1
2 org.mybatis.spring.boot
3 mybatis-spring-boot-starter
4 2.2.0
5

6
7
8 com.alibaba
9 druid-spring-boot-starter
10 1.2.1
11

12
13
14 org.apache.shardingsphere
15 sharding-jdbc-spring-boot-starter
16 4.0.0-RC1
17

18
19 org.apache.shardingsphere
20 sharding-jdbc-spring-namespace
21 4.0.0-RC1
22

23
24
25 mysql
26 mysql-connector-java
27 8.0.22
28

View Code


2. 配置文件

本篇文章数据库分片策略中使用了inline行表达式分片策略

对age字段进行了hash取模运算来进行分片;

数据表分片策略同分库策略

分表需要指定表节点:

actualDataNodes: #由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持inline表达式。缺省表示使用已知数据源与逻辑表名称生成数据节点,用于广播表(即每个库中都需要一个同样的表用于关联查询,多为字典表)或只分库不分表且所有库的表结构完全一致的情况

1 server:
2 port: 8083
3
4 #mybatis信息
5 mybatis:
6 mapper-locations: classpath:mapping/*Mapper.xml
7 type-aliases-package: com.example.demo.entity
8
9 Spring:
10 shardingsphere:
11 datasource:
12 names: ds0,ds1 #配置数据源 分库分表配置
13 #ds0库
14 ds0:
15 type: com.alibaba.druid.pool.DruidDataSource
16 driver-class-name: com.mysql.cj.jdbc.Driver
17 url: jdbc:mysql://127.0.0.1:3306/ds0?serverTimezOne=Asia/Shanghai&useSSL=false&allowMultiQueries=true
18 username: root
19 password: 123456
20 #ds1库
21 ds1:
22 type: com.alibaba.druid.pool.DruidDataSource
23 driver-class-name: com.mysql.cj.jdbc.Driver
24 url: jdbc:mysql://127.0.0.1:3306/ds1?serverTimezOne=Asia/Shanghai&useSSL=false&allowMultiQueries=true
25 username: root
26 password: 123456
27 sharding:
28 #默认数据库分片策略 根据年龄分库
29 default-database-strategy:
30 #行表达式分片策略
31 inline:
32 #分片字段名称
33 sharding-column: age
34 #分片算法表达式 age 对 2 进行取模运算
35 algorithm-expression: ds$->{age % 2}
36 #数据表分片规则
37 tables:
38 #表名
39 tab_user:
40 #由数据源名 + 表名组成,以小数点分隔。表节点
41 actual-data-nodes: ds$->{0..1}.tab_user$->{0..1}
42 #分表策略
43 table-strategy:
44 inline:
45 #通过id分表
46 sharding-column: id
47 #分片算法表达式
48 algorithm-expression: tab_user$->{id % 2}
49 props:
50 sql:
51 show: true
52 swagger:
53 enable: true

View Code


3. 测试

1 /**
2 * 分库分表测试
3 * @author Lv de yin
4 * @Date 2021/9/3
5 */
6 @RequestMapping("pareDaAndTab/")
7 @RestController
8 public class PartDatabaseAndPartTableController {
9
10 @Autowired
11 private TabUserServiceImpl tabUserService;
12
13 /**
14 * 模拟插入数据
15 */
16 List userList = new ArrayList();
17
18 @PostConstruct
19 private void getData(){
20 userList.add(new TabUser(1,"小小", "女", 3));
21 userList.add(new TabUser(2,"爸爸", "男", 30));
22 userList.add(new TabUser(3,"妈妈", "女", 28));
23 userList.add(new TabUser(4,"爷爷", "男", 64));
24 userList.add(new TabUser(5,"奶奶", "女", 62));
25 }
26
27 @PostMapping("save-user")
28 public Object saveUser(){
29 return tabUserService.saveForeach(userList);
30 }
31
32 @GetMapping("list-user")
33 public Object listUser(){
34 return tabUserService.list();
35 }
36
37 @GetMapping("list-user-order")
38 public Object listUserByOrder(@RequestParam(value = "column") String column,@RequestParam(value = "sort") String sort){
39 return tabUserService.listBySort(column, sort);
40 }
41 }

View Code


4. 测试结果

插入测试:



  • 第一条数据小小,通过age字段对2取模得到1,被分到ds1库,通过id字段对2取模得到1,分到tab_user1表。

ds0库:

  tab_user0:

  

   tab_user1:

  

 ds1库:

  tab_user0:

  

   tab_user1:

  

本文来自博客园,作者:EchoLv,转载请注明原文链接:https://www.cnblogs.com/lvdeyinBlog/p/15386325.html



推荐阅读
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了php活动日历-获取下一个即将举行的特色活动相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
author-avatar
mobiledu2502862913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有