万网网站备案,域客式单页网站能申请域名吗,wordpress插件打包下载,网站建设大庆说明#xff1a;Sharding-jdbc是常见的分库分表工具#xff0c;本文介绍Sharding-jdbc的基础使用。
分库分表
首先#xff0c;介绍一下分库分表#xff1a;
#xff08;1#xff09;分库
水平分库#xff1a;以字段为依据#xff0c;按照一定策略#xff08;hash、…说明Sharding-jdbc是常见的分库分表工具本文介绍Sharding-jdbc的基础使用。
分库分表
首先介绍一下分库分表
1分库
水平分库以字段为依据按照一定策略hash、range将一个库中的数据拆分到多个库中
垂直分库以表为依据按照业务归属不同将不同的表拆分到不同的库中 2分表
水平分表按照策略将记录路由到不同的表上常见的策略有范围、hash、字段值
垂直分表根据业务相关性拆分表字段将一张表拆分为多张表 水平分就是横着一刀垂直分就是竖着一刀。
垂直分库、垂直分表我认为是设计时考虑的像微服务架构根据业务场景拆分多个小的服务每个服务都可以有自己的数据库是垂直分库。
而垂直分表某张表的字段过长可以考虑将表字段按照业务相关性拆分成多张表另外当表中有text类型的字段时为了避免影响其他字段索引率也需要独立出来一张表用主键对应阿里巴巴《Java开发手册》是垂直分表的体现。
3需要考虑的问题
分库 跨库事务 跨库的JOIN 分表 多张表如何保证主键不重复 多张表的count、order by、group by 及 聚合函数问题
Sharding-jdbc使用
这里介绍使用Sharding-jdbc实现水平分表
1创建数据库表
先创建两张数据库表
# 创建数据库
create schema order_db collate utf8mb3_general_ci;# 创建表
use order_db;CREATE TABLE t_order_1
(order_id bigint NOT NULL COMMENT 订单id,price decimal(10, 2) NOT NULL COMMENT 订单价格,user_id bigint NOT NULL COMMENT 下单用户id,status varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 订单状态,PRIMARY KEY (order_id) USING BTREE
) ENGINE InnoDBDEFAULT CHARSET utf8mb3ROW_FORMAT DYNAMIC;CREATE TABLE t_order_2
(order_id bigint NOT NULL COMMENT 订单id,price decimal(10, 2) NOT NULL COMMENT 订单价格,user_id bigint NOT NULL COMMENT 下单用户id,status varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 订单状态,PRIMARY KEY (order_id) USING BTREE
) ENGINE InnoDBDEFAULT CHARSET utf8mb3ROW_FORMAT DYNAMIC;2创建项目
创建一个Spring Boot项目pom如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.hezy/groupIdartifactIdsharding-jdbc-demo/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!-- shardingJDBC核心依赖 --dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactIdversion5.2.1/versionexclusionsexclusionartifactIdsnakeyaml/artifactIdgroupIdorg.yaml/groupId/exclusionexclusionartifactIdcosid-core/artifactIdgroupIdme.ahoo.cosid/groupId/exclusion/exclusions/dependency!-- 版本冲突 --dependencygroupIdorg.yaml/groupIdartifactIdsnakeyaml/artifactIdversion1.33/version/dependencydependencygroupIdme.ahoo.cosid/groupIdartifactIdcosid-core/artifactIdversion1.19.3/version/dependency!--XA 分布式事务 --dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-transaction-xa-core/artifactIdversion5.2.1/versionexclusionsexclusionartifactIdtransactions-jdbc/artifactIdgroupIdcom.atomikos/groupId/exclusionexclusionartifactIdtransactions-jta/artifactIdgroupIdcom.atomikos/groupId/exclusion/exclusions/dependency!-- SpringBoot依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdexclusionsexclusionartifactIdsnakeyaml/artifactIdgroupIdorg.yaml/groupId/exclusion/exclusions/dependency!--测试类依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependency!--durid数据库连接池--dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.20/version/dependency!-- mysql连接驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!-- mybatisplus依赖 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3.3/version/dependency/dependencies
/project3编写代码
创建pojo对象注意表名是t_order没有加后缀
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.math.BigDecimal;Data
NoArgsConstructor
AllArgsConstructor
TableName(t_order)
public class Order implements Serializable {TableIdprivate Long orderId;private BigDecimal price;private Long userId;private String status;
}创建Service和Mapper
OrderService
import com.baomidou.mybatisplus.extension.service.IService;
import com.hezy.pojo.Order;public interface OrderService extends IServiceOrder {
}OrderServiceImpl
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hezy.mapper.OrderMapper;
import com.hezy.pojo.Order;
import com.hezy.service.OrderService;
import org.springframework.stereotype.Service;Service
public class OrderServiceImpl extends ServiceImplOrderMapper, Order implements OrderService {
}OrderMapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hezy.pojo.Order;
import org.apache.ibatis.annotations.Mapper;Mapper
public interface OrderMapper extends BaseMapperOrder {
}启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}4配置文件
配置文件中定义了数据库配置及水平分表的策略采用取模%2的方式
spring:main:# 允许Bean重复定义覆盖allow-bean-definition-overriding: trueshardingsphere:datasource:# 数据源名称,多个数据源时使用逗号,分割names: m1m1:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/order_db?serverTimezoneAsia/ShanghaicharacterEncodingutf8username: rootpassword: 123456sharding:tables:t_order:# 配置数据节点m1.t_order_1m1.t_order_2使用上面names的配置名称actual-data-nodes: m1.t_order_$-{1..2}key-generator:# 配置主键及主键生成算法column: order_id# 雪花算法type: SNOWFLAKEtable-strategy:inline:# 配置分片键sharding-column: order_id# 配置分片策略 order_id % 2 1 的值就是数据实际要进入的数据表 # 利用“取模”计算的方式进行分片将分片键除以分片表的个数得到的模就是该数据要进入的数据表# 示例中共有2张分片表则此处求取分片键的值与分片表的模数表示为 order_id % 2又因为分片表的初始值以 1 开始则再加上1algorithm-expression: t_order_$-{order_id % 2 1}
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 配置数据库字段与实体类映射方式是否是小驼峰命名法map-underscore-to-camel-case: trueglobal-config:db-config:# 配置数据表前缀table-prefix: t_5测试
写一个测试类如下
import com.hezy.pojo.Order;
import com.hezy.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.math.BigDecimal;
import java.util.List;SpringBootTest
public class OrderMapperTest {Autowiredprivate OrderService orderService;Testpublic void insertTest() {for (int i 0; i 10; i) {Order order new Order();order.setStatus(正常);order.setPrice(new BigDecimal(20));order.setUserId(1L);boolean save orderService.save(order);System.out.println(save);}}Testpublic void findAllTest() {ListOrder list orderService.list();System.out.println(list);}
}执行插入方法插入完成 可见数据分散插入到对应的表中 试一下查询也是查出10条记录而不是单张表的5条记录。 注意
如果是手写SQL不用Mybatis-Plus的API那么写SQL的时候注意不要带上表名后缀 Select(select * from t_order)ListOrder findALl();不要写成下面这样这样就是查单张表的5条记录了。 Select(select * from t_order_1)ListOrder findALl();参考
代码 https://gitee.com/learning_demo/sharding-jdbc https://gitee.com/xscodeit/xushu_springboot_demos/tree/master/Sharding
博客
Sharding-JDBC分库分表