使用Apache ShardingSphere简答实现水平分表

news2024/11/15 21:43:01

1 简介

Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。

官方网站

https://shardingsphere.apache.org/document/current/cn/overview/

2 创建数据库和表

# 创建数据库
CREATE DATABASE mytest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

# 创建表
CREATE TABLE article_1 (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
	title VARCHAR(50) NOT NULL,
	summary VARCHAR(300) NOT NULL,
	keywords VARCHAR(100) NOT NULL,
    create_time timestamp not null default CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

# 创建表
CREATE TABLE article_2 (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
	title VARCHAR(50) NOT NULL,
	summary VARCHAR(300) NOT NULL,
	keywords VARCHAR(100) NOT NULL,
    create_time timestamp not null default CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

3 工程目录

[在这里插入图片描述

4 源代码

注意的问题:

(1) 不要使用druid-spring-boot-starter自动装配,直接使用“druid”即可;

(2)我用的shardingsphere-jdbc-core-spring-boot-starter版本是5.0.0,测试5.1.0和5.2.0一直报错,不知道什么原因

4.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mason</groupId>
    <artifactId>subtable</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>

        <!-- Operate the mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <!-- 引入druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>

        <!-- druid不要使用下面的自动装配 -->
        <!--
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.4</version>
        </dependency>
        -->

        <!-- shardingsphere -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.0.0</version>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

4.2 application.yml

注意:配置数据库和表是重点

# 数据库分表

spring:
  application:
    name: subtable

  shardingsphere:
    # 显示sql
    props:
      sql:
        show: true


    datasource:
      # 连接多个数据库时,可以设置多个names和datasource
      # names: db1,db2

      # 连接单个数据库
      names: mytest

      mytest:
        # 连接数据库
        url: jdbc:mysql://192.168.108.200:3306/mytest?useUnicode=true&&characterEncoding=utf-8&&useSSL=false
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver

        # set druid
        type: com.alibaba.druid.pool.DruidDataSource

        druid:
          initial-size: 5
          min-idle: 5
          max-active: 20
          max-wait: 6000
          time-between-eviction-runs-millis: 60000
          min-evictable-idle-time-millis: 30000
          test-on-borrow: false
          test-on-return: false
          pool-prepared-statements: true
          max-pool-prepared-statement-per-connection-size: 20

    # 配置规则
    rules:

      # 配置分片
      sharding:


        # 设置主键生成策略
        key-generators:
          # 自定义主键生成算法名称
          snowflake:
            type: SNOWFLAKE

        # 自定义分片算法
        sharding-algorithms:
          # 自定义分片算法名称
          article-strategy-inline:
            type: INLINE
            props:
              algorithm-expression: article_$->{id % 2 + 1}

        # 配置表
        tables:
          # 自定义的表名
          article:
            # 配置数据库和全部的表
            # 含有article_1, article_2两个表
            actual-data-nodes: mytest.article_$->{1..2}

            # 主键生成策略
            key-generate-strategy:
              # 对应article表中自定义的字段
              column: id
              # 使用上面自定义的主键生成算法
              key-generator-name: snowflake


            # 配置分表策略
            table-strategy:
              standard:
                # 对应article表中自定义的字段
                sharding-column: id
                # 使用上面自定义的分片算法
                sharding-algorithm-name: article-strategy-inline

# print logs
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 关闭数据库下划线自动转驼峰
    map-underscore-to-camel-case: false

4.3 Article

package com.mason.subtable.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("article")
public class Article {
    private Long id;
    private String title;
    private String summary;
    private String keywords;

    @TableField("create_time")
    private String create_time;
    @TableField("update_time")
    private String update_time;
}

4.4 ArticleMapper

package com.mason.subtable.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mason.subtable.entity.Article;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ArticleMapper extends BaseMapper<Article> {
}

4.5 DataService

package com.mason.subtable.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mason.subtable.entity.Article;
import com.mason.subtable.mapper.ArticleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.List;


@Service
public class DataService {

    @Autowired
    private ArticleMapper articleMapper;

    // 添加数据
    public int addMultiData(){
        // 批量添加数据
        Article article = new Article();
        article.setTitle("河南大学");
        article.setKeywords("河南,大学");
        article.setSummary("河南大学在开封");
        this.articleMapper.insert(article);

        article = new Article();
        article.setTitle("软件学院");
        article.setKeywords("河南,大学");
        article.setSummary("河南大学在开封");
        this.articleMapper.insert(article);

        article = new Article();
        article.setTitle("河南大学");
        article.setKeywords("软件,学院");
        article.setSummary("河南大学软件学院");
        this.articleMapper.insert(article);

        return 1;
    }

    // 获取数据
    public List<Article> getMultiData(){
        QueryWrapper<Article> wrapper = new QueryWrapper<>();
        wrapper.eq("title","河南大学");
        return this.articleMapper.selectList(wrapper);
    }

}

4.6 DataController

package com.mason.subtable.controller;


import com.mason.subtable.entity.Article;
import com.mason.subtable.service.DataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
@RequestMapping("/data")
public class DataController {
    @Autowired
    private DataService dataService;

    @GetMapping("/add")
    public int addData(){
        return this.dataService.addMultiData();
    }

    @GetMapping("/query")
    public List<Article> queryData(){
        return this.dataService.getMultiData();
    }

}

4.7 SubtableApplication

package com.mason.subtable;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SubtableApplication {
    public static void main(String[] args) {
        SpringApplication.run(SubtableApplication.class, args);
    }
}

5 结果截图

在浏览器中输入以下地址;

http://127.0.0.1:8080/data/add

数据会被根据算法插入到article_1和article_2其中一个表中。

在这里插入图片描述

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

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

相关文章

【算法题刷题笔记】华为OD机试 - 农场施肥

样例一&#xff1a; 5 7 5 7 9 15 10>> 9样例二&#xff1a; 3 1 2 3 4>> -1解题思路 题目大概意思&#xff1a; 给你N个数&#xff0c; 还有一个数M&#xff0c; 让你求K&#xff0c; 进行M次减K操作&#xff0c; 令这N个数都小于等于0。 思路&#xff1a; 利用…

frp配置多端口内网穿透?frp多端口怎么配置?

FRP内网穿透应用场景&#xff1a;本地Web服务外网访问、本地开发微信、本地联调支付宝\微信支付、TCP/UDP端口转发 在本机开发好的网站想让客户测试不在需要上传到服务器上面&#xff0c;使用FRP内外网穿透轻松解决&#xff1b;微信开发也不需要在上传到服务器&#xff0c;使用…

拒绝服务攻击

目录 一、初始DOS攻击与防御 1.1 DOS攻击概念 1.2 DOS攻击原因 1.2.1 内因 1.2.2 外因 1.3 DOS攻击原理 1.4 DOS攻击方法 二、DOS常见攻击技术 2.1 SYN Flood 2.1.1 基本思想 2.1.2 方法 2.1.3 防御措施 2.2 ICMP Flood 2.2.1 Smurf Flood 2.2.2 Ping of Death …

【微信小程序开发】第 10 课 - WXML 模版语法 - 数据绑定

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、数据绑定 2.1、绑定的基本规则 2.2、Mustache 语法的格式 2.2.1动态绑定内容 2.2.2动态绑定属性 2.2.3三元运…

Qqis中采用栅格工具生成XYZ瓦片(目录)简介

目录 前言 一、Qgis的相关功能 1、数据准备 2、将两个xyz图源添加到图层 二、Qgis栅格工具生成 1、生成xyz图块工具在哪里 2、生成xyz图块怎么用 3、下载结果 4、Leaflet加载离线瓦块 总结 前言 在上一篇博客中&#xff0c;介绍了一种在Qgis中基于QMetaTiles插件进行xyz瓦…

Linux---环境变量、$符号、自行设置环境变量

1. 环境变量 环境变量是操作系统&#xff08;Windows、Linux、Mac&#xff09;在运行的时候&#xff0c;记录的一些关键性信息&#xff0c;用以辅 助系统运行。 在Linux系统中执行&#xff1a;env命令即可查看当前系统中记录的环境变量 环境变量是一种Key-Value型结构&…

chatgpt赋能python:Python如何选取CSV某几列数据

Python如何选取CSV某几列数据 在数据处理过程中&#xff0c;CSV是一种非常常见的数据文件类型。CSV文件中的数据由逗号分隔的值&#xff08;Comma-Separated Values&#xff09;组成。处理CSV数据的任务之一是从CSV文件中选择特定的列数据&#xff0c;以进行数据分析或处理。在…

shell脚本基础

目录 一、概述 二、shell (一)shell命令解释环境 &#xff08;二&#xff09;类型 &#xff08;三&#xff09;查看系统中支持的shell&#xff1a;cat /etc/shells &#xff08;四&#xff09;查看系统默认shell&#xff1a; echo $SHELL 三、变量 &#xff08;一&…

HTMLCSS Day04 CSS盒模型

文章目录 1.盒子组成盒子属性&#xff08; Box properties&#xff09;marginborderpaddingwidth & height盒子一般指的是块元素&#xff0c;盒子是我们布局的重要机制。一个盒子应该由外边距、边框、内边距、内容组成。 - width & height- 边框属性1.什么是边框?2.边…

TiDB Contributor 资料汇总

作者&#xff1a; Billmay表妹 原文来源&#xff1a; https://tidb.net/blog/cf95cdb7 开源社区建设 TiDB 社区是由 TiDB 生态中的开发者、用户、合作伙伴一起建立的分享、学习平台。TiDB 线上社区汇聚了 29149 位 TiDB 资深用户&#xff08;注册用户数&#xff09;&#x…

将一个一维数组前段和后端的0元素去除的numpy.trim_zeros()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 除去一维数组第一个非零元素之前的零 除去一维数组最后一个非零元素之后的零 numpy.trim_zeros() 选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([0,0,1,0,2,0,0])…

前端Vue分享菜单按钮弹框、微博分享、QQ分享、微信好友、朋友圈

前端Vue分享菜单按钮弹框、微博分享、QQ分享、微信好友、朋友圈 &#xff0c; 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?id13085 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- 分享 ref: 设置一个唯一ref contentHeight&#xff…

记一次fastjson事件应急响应

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 事件背景介绍02 事件分析过程03 事件分析结果04 安全加固建议 01 事件背景介绍 某内部应急演练中&#xff0c;安全部门收到通知&#xff0c;称公司内部资产被入侵&#xff0c;且可能已经开始内网横…

YOLO V2原理总结

yolo v2在yolo v1的基础上添加或更换了一些内容&#xff0c;一定程度上结局了yolo v1的一些问题。 ✨1 概括 做出的改变有8个&#xff1a; 添加Batch Normalization层高分辨率主干网络anchor box机制全卷积网络结构新的主干网络K-means聚类先验框使用更高分辨率特征多尺度训练…

(十)异步-委托异步调用(4)

一、委托异步执行 当委托对象被调用时&#xff0c;它调用其调用列表中包含的方法。这是同步完成的。 如果委托对象在调用列表中只有一个方法&#xff08;引用方法&#xff09;&#xff0c;它就可以异步执行这个方法。委托类有两个方法&#xff0c;叫作 BeginInvoke 和 EndInv…

【计算机网络】进程崩溃或网络中断后,TCP 连接还存在吗?

【计算机网络】进程崩溃或网络中断后&#xff0c;TCP 连接还存在吗&#xff1f; 参考资料&#xff1a; TCP 连接&#xff0c;一端断电和进程崩溃有什么区别&#xff1f; 拔掉网线后&#xff0c; 原本的 TCP 连接还存在吗&#xff1f; TCP/IP卷一:94—TCP保活机制 TCP Keepaliv…

记一次gitlab应急响应

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 事件背景介绍02 事件分析过程03 事件分析结果04 安全加固建议 01 事件背景介绍 某内部应急演练中&#xff0c;态势感知平台上出现gitlab RCE漏洞攻击成功告警&#xff0c;现需根据流量情况进行安全…

013、数据库管理之连接管理

连接管理 TiDB的连接特性连接TiDB 数据库开发接口支持 实验案例 TiDB的连接特性 无状态MySQL协议支持 100% 兼容MySQL 5.7协议支持MySQL 5.7常用功能与语法 MySQL 语法支持的限制&#xff08;不支持的功能特性&#xff09; 存储过程触发器外键函数其它 连接TiDB 数据库 使…

记一次shiro应急响应

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 事件背景介绍02 事件分析过程03 事件分析结果04 安全加固建议 01 事件背景介绍 某内部应急演练中&#xff0c;安全部门监测到WAF上存在shiro攻击成功告警信息&#xff0c;现需根据流量情况进行安全…

Vue中的表单上传与文件预览

Vue中的表单上传与文件预览 在Web应用程序中&#xff0c;文件上传和预览是非常常见的功能。在Vue中&#xff0c;我们可以使用axios和FormData来实现表单上传&#xff0c;使用FileReader来实现文件预览。在本文中&#xff0c;我们将介绍如何在Vue中实现表单上传和文件预览功能。…