最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot3和ShardingSphere5框架實現(xiàn)數(shù)據(jù)分庫分表

 更新時間:2023年08月11日 08:28:22   作者:知了一笑  
這篇文章主要介紹了SpringBoot3和ShardingSphere5框架實現(xiàn)數(shù)據(jù)分庫分表的相關(guān)資料,需要的朋友可以參考下

一、簡介

分庫分表的設(shè)計和實現(xiàn)方式,在之前的內(nèi)容中總結(jié)過很多,本文基于 SpringBoot3 ShardingSphere5 框架實現(xiàn)數(shù)據(jù)分庫分表的能力;

不得不提 ShardingSphere5 文檔中描述的兩個基本概念:

垂直分片

按照業(yè)務(wù)拆分的方式稱為垂直分片,又稱為縱向拆分,它的核心理念是專庫專用。在拆分之前,一個數(shù)據(jù)庫由多個數(shù)據(jù)表構(gòu)成,每個表對應(yīng)著不同的業(yè)務(wù)。而拆分之后,則是按照業(yè)務(wù)將表進行歸類,分布到不同的數(shù)據(jù)庫中,從而將壓力分散至不同的數(shù)據(jù)庫。

水平分片

水平分片又稱為橫向拆分。 相對于垂直分片,它不再將數(shù)據(jù)根據(jù)業(yè)務(wù)邏輯分類,而是通過某個字段(或某幾個字段),根據(jù)某種規(guī)則將數(shù)據(jù)分散至多個庫或表中,每個分片僅包含數(shù)據(jù)的一部分。

下面從案例實踐中,看看 ShardingSphere5 框架是如何實現(xiàn)分庫分表的原理;

二、工程搭建

1、工程結(jié)構(gòu)

2、依賴管理

這里只看兩個核心組件的依賴: shardingsphere-jdbc 組件是 5.2.1 版本, mybatis 組件是 3.5.13 版本,在依賴管理中還涉及MySQL和分頁等,并且需要添加很多排除配置,具體見源碼;

<!-- Mybatis組件 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- ShardingSphere分庫分表 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>${shardingsphere.version}</version>
</dependency>

三、配置詳解

1、配置文件

此處只展示分庫分表的相關(guān)配值,默認(rèn)數(shù)據(jù)源使用 db_master 庫,注意 tb_order 庫表路由的策略和分片算法的關(guān)聯(lián)關(guān)系,其他工程配置詳見源碼倉庫;

spring:
# 分庫分表配置
shardingsphere:
datasource:
# 默認(rèn)數(shù)據(jù)源
sharding:
default-data-source-name: db_master
names: db_master,db_0,db_1
db_master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/shard_db
username: root
password: 123456
db_0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/shard_db_0
username: root
password: 123456
db_1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/shard_db_1
username: root
password: 123456
rules:
sharding:
tables:
# tb_order邏輯
tb_order:
actual-data-nodes: db_${0..1}.tb_order_${0..2}
# tb_order庫路由
database-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: database_inline
# tb_order表路由
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: table_inline
sharding-algorithms:
# tb_order庫路由算法
database_inline:
type: INLINE
props:
algorithm-expression: db_${order_id % 2}
# tb_order表路由算法
table_inline:
type: INLINE
props:
algorithm-expression: tb_order_${order_id % 3}
props:
sql-show: true
sql-comment-parse-enabled: true

2、配置原理

在配置中需要管理三個數(shù)據(jù)源, shard_db 默認(rèn)庫,在操作不涉及需要路由的表時默認(rèn)使用該數(shù)據(jù)源, shard_db_0 shard_db_1 tb_order 邏輯表的路由庫;

邏輯表 tb_order 整體使用兩個數(shù)據(jù)庫,每個庫建3張結(jié)構(gòu)相同相同的表,在操作 tb_order 數(shù)據(jù)時,會根據(jù) order_id 字段值定位數(shù)據(jù)所屬的分片節(jié)點;

庫路由 db_${0..1} 采用 db_${order_id%2} 的算法; 表路由 tb_order_${0..2} 采用 tb_order_${order_id%3} 的算法;

四、測試案例

1、主庫操作

基于Mybatis持久層框架,實現(xiàn)對 shard_db 默認(rèn)庫的數(shù)據(jù)操作,注意控制臺的日志打印,可以看到一系列解析邏輯以及庫表節(jié)點的定位,分頁查詢使用PageHelper組件即可;

public class MasterTest {
@Autowired
private BuyerMapper buyerMapper ;
@Autowired
private SellerMapper sellerMapper ;
@Test
public void testBuyerQuery (){
// 主鍵查詢
Buyer buyer = buyerMapper.selectByPrimaryKey(1) ;
System.out.println(buyer.getId()+";"+buyer.getBuyerName());
}
@Test
public void testBuyerInsert (){
// 新增數(shù)據(jù)
Buyer buyer = new Buyer() ;
buyer.setBuyerName("買家Three");
System.out.println(buyerMapper.insert(buyer));
}
@Test
public void testBuyerUpdate (){
// 更新數(shù)據(jù)
Buyer buyer = buyerMapper.selectByPrimaryKey(3) ;
if (buyer != null){
buyer.setBuyerName("Three買家");
System.out.println(buyerMapper.updateByPrimaryKey(buyer));
}
}
@Test
public void testSellerPage (){
// 1、設(shè)置分頁和查詢條件
PageHelper.startPage(2,2) ;
SellerExample sellerExample = new SellerExample() ;
sellerExample.setOrderByClause("id asc");
// 2、查詢數(shù)據(jù)
List<Seller> sellerList = sellerMapper.selectByExample(sellerExample) ;
// 3、構(gòu)建分頁實體對象
PageInfo<Seller> pageInfo = new PageInfo<>(sellerList) ;
System.out.println(pageInfo);
}
}

2、分庫操作

在對 tb_order 表執(zhí)行增刪改查時,會根據(jù) order_id 的字段值計算庫表的路由節(jié)點,注意分頁時會查詢所有的分庫和分表,然后匯總查詢的結(jié)果;

public class ShardTest {
@Autowired
private OrderMapper orderMapper ;
/**
* 寫入100條數(shù)據(jù)
*/
@Test
public void testOrderInsert (){
for (int i=1 ; i<= 100 ; i++){
Order order = new Order(i,i%3+1,i%3+1) ;
// orderMapper.insert(order) ;
}
}
@Test
public void testOrderQuery (){
Order order = orderMapper.selectByPrimaryKey(5) ;
System.out.println(order);
}
@Test
public void testOrderUpdate (){
Order order = orderMapper.selectByPrimaryKey(100) ;
if (order != null){
// 原數(shù)據(jù):買家和賣家ID都是2
order.setBuyerId(1);
order.setSellerId(3);
orderMapper.updateByPrimaryKey(order) ;
}
}
@Test
public void testOrderPage (){
// 1、設(shè)置分頁和查詢條件
PageHelper.startPage(1,10) ;
OrderExample orderExample = new OrderExample() ;
orderExample.createCriteria().andBuyerIdEqualTo(2).andSellerIdEqualTo(2);
orderExample.setOrderByClause("order_id desc");
// 2、查詢數(shù)據(jù)
List<Order> orderList = orderMapper.selectByExample(orderExample) ;
// 3、構(gòu)建分頁實體對象
PageInfo<Order> pageInfo = new PageInfo<>(orderList) ;
System.out.println(pageInfo);
}
}

3、綜合查詢

編寫一個訂單詳情查詢接口,同時使用三個庫構(gòu)建數(shù)據(jù)結(jié)構(gòu);如果是基于列表數(shù)據(jù)的檢索,比較常規(guī)做法的是構(gòu)建ES索引結(jié)構(gòu),如果沒有搜索的需求,可以在訂單表分頁查詢后去拼接其他結(jié)構(gòu);

@RestController
public class OrderController {
@Resource
private BuyerMapper buyerMapper ;
@Resource
private SellerMapper sellerMapper ;
@Resource
private OrderMapper orderMapper ;
/**
* 查詢訂單詳情
*/
@GetMapping("/order/info/{orderId}")
public Map<String,Object> orderInfo (@PathVariable Integer orderId){
Map<String,Object> orderMap = new HashMap<>() ;
Order order = orderMapper.selectByPrimaryKey(orderId) ;
if (order != null){
orderMap.put("order",order) ;
orderMap.put("buyer",buyerMapper.selectByPrimaryKey(order.getBuyerId())) ;
orderMap.put("seller",sellerMapper.selectByPrimaryKey(order.getSellerId())) ;
}
return orderMap ;
}
}

查看SQL語句

db_master ::: select id, buyer_name from tb_buyer where id = ? ::: [1]
db_master ::: select id, seller_name from tb_seller where id = ? ::: [3]
db_0 ::: select order_id, seller_id, buyer_id from tb_order_1 where order_id = ? ::: [100]

五、參考源碼

文檔倉庫:
https://gitee.com/cicadasmile/butte-java-note
源碼倉庫:
https://gitee.com/cicadasmile/butte-spring-parent

到此這篇關(guān)于SpringBoot3和ShardingSphere5框架實現(xiàn)數(shù)據(jù)分庫分表的文章就介紹到這了,更多相關(guān)SpringBoot3數(shù)據(jù)分庫分表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡單了解springboot eureka交流機制

    簡單了解springboot eureka交流機制

    這篇文章主要介紹了簡單了解springboot eureka交流機制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調(diào)試技巧

    Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調(diào)試技巧

    數(shù)組越界訪問是指訪問數(shù)組中超出其有效索引范圍的元素,這是一種常見的編程錯誤,可能導(dǎo)致程序崩潰或數(shù)據(jù)損壞,下面這篇文章主要給大家介紹了關(guān)于Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調(diào)試技巧的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • java布局管理之CardLayout簡單實例

    java布局管理之CardLayout簡單實例

    這篇文章主要為大家詳細介紹了java布局管理之CardLayout的簡單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 阿里四面之Spring Exception的原理解析

    阿里四面之Spring Exception的原理解析

    本文給大家介紹阿里四面之Spring Exception的原理解析,本文通過錯誤場景分析給大家詳細介紹Spring異常處理流程,感興趣的朋友一起看看吧
    2021-10-10
  • 將Arthas整合到Java業(yè)務(wù)鏡像中的流程步驟

    將Arthas整合到Java業(yè)務(wù)鏡像中的流程步驟

    在現(xiàn)代Java應(yīng)用開發(fā)中,診斷和調(diào)試是一個不可或缺的環(huán)節(jié),Arthas,作為阿里巴巴開源的一款Java診斷工具,提供了一種在不修改代碼的情況下,實時監(jiān)控、診斷和調(diào)試Java應(yīng)用程序的解決方案,本文將詳細介紹Arthas的基本概念,并逐步指導(dǎo)如何將其整合到Java業(yè)務(wù)鏡像中
    2025-02-02
  • Java內(nèi)存模型知識匯總

    Java內(nèi)存模型知識匯總

    本文中,有很多定義和說法,都是筆者自己理解后定義出來的。希望能夠讓讀者可以對Java內(nèi)存模型有更加清晰的認(rèn)識。當(dāng)然,如有偏頗,歡迎指正。
    2018-09-09
  • 詳解Spring?boot?GraalVM?原生鏡像支持

    詳解Spring?boot?GraalVM?原生鏡像支持

    GraalVM?Native?Image?是?GraalVM?提供的?ahead-of-time?(AOT)?編譯工具,可以將?Java?應(yīng)用編譯為本地可執(zhí)行文件,跳過?JVM?啟動和?JIT?編譯階段,達到“秒級啟動”和低內(nèi)存占用的效果,本文介紹Spring?boot?GraalVM?原生鏡像支持詳解,感興趣的朋友一起看看吧
    2025-12-12
  • Java split()方法中的特殊符號舉例詳解

    Java split()方法中的特殊符號舉例詳解

    Java中的split方法可以將一個字符串按照指定的分隔符進行分割,返回一個字符串?dāng)?shù)組,這篇文章主要給大家介紹了關(guān)于Java split()方法中的特殊符號的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • 大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機號碼脫敏)

    大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機號碼脫敏)

    這篇文章主要介紹了大數(shù)據(jù) java hive udf函數(shù)(手機號碼脫敏),的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Win10系統(tǒng)下配置Java環(huán)境變量

    Win10系統(tǒng)下配置Java環(huán)境變量

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Win10系統(tǒng)下配置Java環(huán)境變量展開,文中有非常詳細的介紹及圖文示例,需要的朋友可以參考下
    2021-06-06

最新評論

磐石市| 太康县| 藁城市| 寻乌县| 泽州县| 定襄县| 珲春市| 台安县| 宣化县| 敦煌市| 申扎县| 沂南县| 融水| 井研县| 新建县| 芷江| 会同县| 陕西省| 崇阳县| 黄大仙区| 会东县| 乐清市| 中卫市| 建阳市| 蒲江县| 库尔勒市| 济阳县| 哈密市| 海城市| 民和| 济南市| 汤阴县| 赤水市| 北海市| 定陶县| 故城县| 恭城| 博野县| 温泉县| 洱源县| 陇川县|