當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
Springboot2.x +JPA 集成 Apache ShardingSphere 分库分表
生活随笔
收集整理的這篇文章主要介紹了
Springboot2.x +JPA 集成 Apache ShardingSphere 分库分表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
分庫(kù)分表背景:
數(shù)據(jù)庫(kù)性能瓶頸:主要分為按照業(yè)務(wù)來(lái)劃分或者按照數(shù)據(jù)量來(lái)劃分。
拆分方式:
水平拆分(每個(gè)表的結(jié)構(gòu)都一樣):訂單表數(shù)據(jù)量大,我們可以水平拆分 ,分成order表1、order表2、order表3 。。。
垂直拆分:一個(gè)多字段的表拆分成多個(gè)表
例如:order訂單表和oderItem訂單詳情表
一個(gè)訂單會(huì)購(gòu)買多件商品,因此,訂單order表中會(huì)只有一條數(shù)據(jù),orderItem訂單項(xiàng)表會(huì)對(duì)應(yīng)這個(gè)訂單購(gòu)買的多件商品。
文章目錄
- 技術(shù)選型
- 1. 引入 Maven 依賴
- 2. 規(guī)則配置
- 3. 實(shí)體
- 4. 接口
- 5. 表結(jié)構(gòu)
- 6. 測(cè)試類
- 7. 完整pom
技術(shù)選型
| spring-boot | 2.4.3 |
| jpa | 2.4.3 |
| shardingsphere | 5.0.0-alpha |
| mysql | 5.7.3 |
| hikari | 3.4.5 |
分庫(kù)分表
官網(wǎng)文檔:
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/usage/sharding/spring-boot-starter/
1. 引入 Maven 依賴
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0-alpha</version></dependency>2. 規(guī)則配置
#分庫(kù)分表 場(chǎng)景:一個(gè)客戶多個(gè)訂單 按照user_id分庫(kù) 按照order_id 分表# 配置真實(shí)數(shù)據(jù)源 spring.shardingsphere.datasource.names=ds0,ds1############################################################################## # 1.連接池 2.驅(qū)動(dòng) 3.用戶名 4.密碼 5.連接url SpringBoot2.x寫法 ############################################################################# spring.shardingsphere.datasource.common.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.common.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.common.username=root spring.shardingsphere.datasource.common.password=root spring.shardingsphere.datasource.ds_0.jdbc-url=jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false spring.shardingsphere.datasource.ds_1.jdbc-url=jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC&useSSL=false# 配置 t_order 表規(guī)則 #ds$->{0..1} 指的是ds0 ds1 2個(gè)數(shù)據(jù)庫(kù) #t_order_$->{0..1} 指的是 t_order_0 t_order_1 2個(gè)表 #ds$->{0..1}.t_order_$->{0..1} 指的是ds0 ds1 2個(gè)數(shù)據(jù)庫(kù)下面的t_order_0和t_order_1 2個(gè)表 spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order_$->{0..1}# 配置分庫(kù)策略 # user_id 指的是按照user_id進(jìn)行分庫(kù) # database-inline 自定義策略名稱 下面會(huì)用到 spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-column=user_id spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-algorithm-name=database-inline# 配置分表策略 #order_id 指的是按照user_id進(jìn)行分表 #table-inline 自定義策略名稱 下面會(huì)用到 spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=order_id spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=table-inline# 配置 分片算法 #分庫(kù)分片算法 取模算法 #ds$->{user_id % 2} 指的是user_id與2取模 spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.type=INLINE spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.props.algorithm-expression=ds$->{user_id % 2}#分表分片算法 取模算法 #ds$->{order_id % 2} 指的是order_id與2取模 spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=INLINE spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithm-expression=t_order_$->{order_id % 2}# 分片算法配置 #order_id 生成規(guī)則 #snowflake 雪花算法 spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=order_id spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=snowflake# 分布式序列算法配置 spring.shardingsphere.rules.sharding.key-generators.snowflake.type=SNOWFLAKE spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id=123# 具體的屬性配置 spring.shardingsphere.props.sql-show=true3. 實(shí)體
package com.gblfy.distributedsharding.entity;import lombok.Data;import javax.persistence.*;@Data @Entity @Table(name = "t_order") public class OrderEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long orderId;private Integer userId; }4. 接口
package com.gblfy.distributedsharding.mapper;import com.gblfy.distributedsharding.entity.OrderEntity; import org.springframework.data.jpa.repository.JpaRepository;import java.util.List;public interface OrderMapper extends JpaRepository<OrderEntity, Long> {OrderEntity findByOrderId(Long orderId);List<OrderEntity> findByUserId(Integer userId); }5. 表結(jié)構(gòu)
CREATE DATABASE ds0; use ds0; CREATE TABLE `t_order_0` (`order_id` bigint(20) unsigned NOT NULL,`user_id` int(11) DEFAULT NULL,PRIMARY KEY (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `t_order_1` (`order_id` bigint(20) unsigned NOT NULL,`user_id` int(11) DEFAULT NULL,PRIMARY KEY (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE DATABASE ds1; use ds1; CREATE TABLE `t_order_0` (`order_id` bigint(20) unsigned NOT NULL,`user_id` int(11) DEFAULT NULL,PRIMARY KEY (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `t_order_1` (`order_id` bigint(20) unsigned NOT NULL,`user_id` int(11) DEFAULT NULL,PRIMARY KEY (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;6. 測(cè)試類
package com.gblfy.distributedsharding;import com.gblfy.distributedsharding.entity.OrderEntity; import com.gblfy.distributedsharding.mapper.OrderMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;import java.util.Random;@SpringBootTest class DistributedShardingApplicationTests {@Autowiredprivate OrderMapper orderMapper;@Testvoid insert() {OrderEntity entity = new OrderEntity();entity.setUserId(new Random().nextInt(999));orderMapper.save(entity);}@Testvoid findByOrderId() {//按照order_id分表 ,會(huì)查詢2次,通過(guò)order_id分表,但是不知道哪個(gè)庫(kù)orderMapper.findByOrderId(570271967295811584L);}@Testvoid findByUserId() {//按照user_id分庫(kù) ,會(huì)查詢2次,通過(guò)user_id分庫(kù),但是不知道哪個(gè)表orderMapper.findByUserId(556);}@Testvoid updateByOrderId() {OrderEntity byOrderId = orderMapper.findByOrderId(570279923689172992L);byOrderId.setUserId(1000);orderMapper.save(byOrderId);} }7. 完整pom
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0-alpha</version></dependency>總結(jié)
以上是生活随笔為你收集整理的Springboot2.x +JPA 集成 Apache ShardingSphere 分库分表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBoot2 集成 xxl-j
- 下一篇: Sublime Text 3 快捷键总结