自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入探索Sharding JDBC:分庫(kù)分表的利器

原創(chuàng) 精選
數(shù)據(jù)庫(kù)
隨著互聯(lián)網(wǎng)應(yīng)用的不斷發(fā)展和用戶量的不斷增加,傳統(tǒng)的數(shù)據(jù)庫(kù)在應(yīng)對(duì)高并發(fā)和大數(shù)據(jù)量的場(chǎng)景下面臨著巨大的挑戰(zhàn)。

作者 | 波哥

審校 | 重樓

隨著互聯(lián)網(wǎng)應(yīng)用的不斷發(fā)展和用戶量的不斷增加,傳統(tǒng)的數(shù)據(jù)庫(kù)在應(yīng)對(duì)高并發(fā)和大數(shù)據(jù)量的場(chǎng)景下面臨著巨大的挑戰(zhàn)。為了解決這一問(wèn)題,分庫(kù)分表成為了一個(gè)非常流行的方案。分庫(kù)分表主流的技術(shù)包括MyCat和Sharding JDBC。我們來(lái)通過(guò)一張圖來(lái)了解這兩者有什么區(qū)別

從上圖可以看到MyCat是一個(gè)單獨(dú)的中間件,讀者朋友們可以把它理解為一個(gè)數(shù)據(jù)庫(kù)(不過(guò)它不是數(shù)據(jù)庫(kù)哦,只是對(duì)于應(yīng)用端來(lái)說(shuō)連接使用MyCat和數(shù)據(jù)庫(kù)是一樣的對(duì)應(yīng)用程序來(lái)說(shuō)不需要關(guān)具體是數(shù)據(jù)庫(kù)還是MyCat;而Sharding JDBC則是整合到應(yīng)用端的它運(yùn)行在應(yīng)用端,和代碼的耦合性相對(duì)MyCat來(lái)說(shuō)要更高)。本文筆者將深入探索Sharding JDBC,介紹其核心概念、工作原理以及使用方法,并通過(guò)一個(gè)示例幫助讀者更好地理解和應(yīng)用Sharding JDBC。

1. 什么是Sharding JDBC?

Sharding JDBC是一款基于Java的開源中間件,用于簡(jiǎn)化分庫(kù)分表的操作和管理。它提供了一套統(tǒng)一的接口和封裝,屏蔽了底層數(shù)據(jù)庫(kù)的細(xì)節(jié),讓開發(fā)者可以像使用單一數(shù)據(jù)庫(kù)一樣操作分布式數(shù)據(jù)庫(kù)。

2. Sharding JDBC的核心概念

2.1 數(shù)據(jù)庫(kù)切片(Sharding)

數(shù)據(jù)庫(kù)切片是指將一個(gè)大型數(shù)據(jù)庫(kù)按照某種規(guī)則拆分成多個(gè)較小的數(shù)據(jù)庫(kù)實(shí)例,每個(gè)數(shù)據(jù)庫(kù)實(shí)例稱為一個(gè)切片。切片可以根據(jù)不同的規(guī)則進(jìn)行拆分,如按照用戶ID、地域等進(jìn)行劃分。

2.2 分布式表(Sharding Table)

分布式表是指將一個(gè)表按照某種規(guī)則拆分成多個(gè)子表,每個(gè)子表存儲(chǔ)了相同表結(jié)構(gòu)的不同數(shù)據(jù)。通常,分布式表的拆分規(guī)則與數(shù)據(jù)庫(kù)切片的規(guī)則相一致。

2.3 數(shù)據(jù)庫(kù)路由(Database Sharding)

數(shù)據(jù)庫(kù)路由是指根據(jù)某種規(guī)則將數(shù)據(jù)庫(kù)的操作路由到對(duì)應(yīng)的數(shù)據(jù)庫(kù)切片上。Sharding JDBC提供了路由策略的配置,可以根據(jù)業(yè)務(wù)需求進(jìn)行靈活的配置。

2.4 表路由(Table Sharding)

表路由是指根據(jù)某種規(guī)則將數(shù)據(jù)操作路由到對(duì)應(yīng)的分布式表上。Sharding JDBC同樣提供了靈活的表路由策略配置,支持多種分表策略。

3. Sharding JDBC的工作原理

簡(jiǎn)單來(lái)說(shuō)Sharding JDBC的工作原理可以概括為以下幾個(gè)步驟:

  • 客戶端發(fā)起數(shù)據(jù)庫(kù)操作請(qǐng)求。
  • Sharding JDBC根據(jù)路由策略解析請(qǐng)求,確定對(duì)應(yīng)的數(shù)據(jù)庫(kù)切片和分布式表。
  • Sharding JDBC將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的數(shù)據(jù)庫(kù)切片和分布式表。
  • 數(shù)據(jù)庫(kù)切片和分布式表執(zhí)行具體的數(shù)據(jù)庫(kù)操作。
  • 結(jié)果返回給Sharding JDBC,再由Sharding JDBC返回給客戶端。

Sharding JDBC通過(guò)對(duì)數(shù)據(jù)庫(kù)操作的解析和轉(zhuǎn)發(fā),實(shí)現(xiàn)了透明的分庫(kù)分表功能,對(duì)上層應(yīng)用透明,使得應(yīng)用無(wú)需關(guān)心分布式數(shù)據(jù)庫(kù)的復(fù)雜性。

4. 如何使用Sharding JDBC?

接下來(lái),我們一起來(lái)看下如何使用。使用Sharding JDBC可以分為以下幾個(gè)步驟:

4.1 引入Sharding JDBC依賴

在項(xiàng)目的pom.xml文件中引入Sharding JDBC的相關(guān)依賴,以及對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)依賴。

4.2 配置數(shù)據(jù)源和數(shù)據(jù)庫(kù)規(guī)則

在配置文件中配置數(shù)據(jù)源和數(shù)據(jù)庫(kù)規(guī)則,包括數(shù)據(jù)庫(kù)連接信息、數(shù)據(jù)庫(kù)切片和分布式表的規(guī)則等。

4.3 編寫業(yè)務(wù)代碼

編寫業(yè)務(wù)代碼時(shí),使用Sharding JDBC提供的API進(jìn)行數(shù)據(jù)庫(kù)操作,無(wú)需關(guān)心具體的數(shù)據(jù)庫(kù)切片和分布式表。

下面筆者根據(jù)上述步驟,以一個(gè)例子來(lái)詳細(xì)展示具體的使用方法

我們以用戶表和訂單表為對(duì)其分庫(kù)分表。

A.引入Sharding JDBC依賴,可以通過(guò)Maven來(lái)管理項(xiàng)目依賴。

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>xxx</version>
</dependency>

B.配置數(shù)據(jù)源和數(shù)據(jù)庫(kù)規(guī)則,在application.yaml中進(jìn)行配置。

spring:
  shardingsphere:
    datasource:
      # 數(shù)據(jù)源配置,定義兩個(gè)數(shù)據(jù)源
      names: ds0, ds1
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/database0
        username: root
        password: root
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/database1
        username: root
        password: root
    sharding:
      tables:
        # 訂單表的配置
        order:
          actualDataNodes: ds${0..1}.order_${0..3}
          # 表路由策略,根據(jù)用戶ID進(jìn)行分表
          tableStrategy:
            standard:
              shardingColumn: user_id
              preciseAlgorithmClassName: com.example.algorithm.PreciseModuloTableShardingAlgorithm
          # 數(shù)據(jù)庫(kù)路由策略,根據(jù)用戶ID進(jìn)行分庫(kù)
          databaseStrategy:
            standard:
              shardingColumn: user_id
              preciseAlgorithmClassName: com.example.algorithm.PreciseModuloDatabaseShardingAlgorithm

C.編寫自定義的分表策略和分庫(kù)策略。例如,我們自定義了

PreciseModuloTableShardingAlgorithm和PreciseModuloDatabaseShardingAlgorithm兩個(gè)算法類,根據(jù)用戶ID進(jìn)行分表和分庫(kù)的計(jì)算。

public class PreciseModuloTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> tableNames, PreciseShardingValue<Long> shardingValue) {
        for (String tableName : tableNames) {
            if (tableName.endsWith(String.valueOf(shardingValue.getValue() % 4))) {
                return tableName;
            }
        }
        throw new IllegalArgumentException("Unsupported table name: " + shardingValue.getLogicTableName());
    }
}

public class PreciseModuloDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> databaseNames, PreciseShardingValue<Long> shardingValue) {
        for (String databaseName : databaseNames) {
            if (databaseName.endsWith(String.valueOf(shardingValue.getValue() % 2))) {
                return databaseName;
            }
        }
        throw new IllegalArgumentException("Unsupported database name: " + shardingValue.getLogicTableName());
    }
}

D. 編寫業(yè)務(wù)代碼,使用Sharding JDBC進(jìn)行數(shù)據(jù)庫(kù)操作。

@Repository
public class OrderRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public List<Order> findOrdersByUserId(Long userId) {
        String sql = "SELECT * FROM `order` WHERE user_id = ?";
        return jdbcTemplate.query(sql, new Object[]{userId}, new BeanPropertyRowMapper<>(Order.class));
    }
    
    public void saveOrder(Order order) {
        String sql = "INSERT INTO `order` (id, user_id, amount) VALUES (?, ?, ?)";
        jdbcTemplate.update(sql, order.getId(), order.getUserId(), order.getAmount());
    }
}

@Service
public class OrderService {
    @Autowired
    private OrderRepository orderRepository;
    
    public List<Order> getOrdersByUserId(Long userId) {
        return orderRepository.findOrdersByUserId(userId);
    }
    
    public void saveOrder(Order order) {
        orderRepository.saveOrder(order);
    }
}

在上述示例中,我們配置了兩個(gè)數(shù)據(jù)源(ds0和ds1),每個(gè)數(shù)據(jù)源對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)實(shí)例。訂單表根據(jù)用戶ID進(jìn)行分表,共分為4張表(order_0、order_1、order_2、order_3),并根據(jù)用戶ID進(jìn)行分庫(kù),共分為2個(gè)數(shù)據(jù)庫(kù)實(shí)例。在業(yè)務(wù)代碼中,我們通過(guò)Sharding JDBC的API來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作,無(wú)需關(guān)心具體的數(shù)據(jù)庫(kù)切片和分布式表。

本文深入探索了Sharding JDBC的核心概念、工作原理和使用方法,并通過(guò)一個(gè)用戶訂單分庫(kù)分表的示例加以完善。通過(guò)使用Sharding JDBC,開發(fā)者可以輕松應(yīng)對(duì)高并發(fā)和大數(shù)據(jù)量的場(chǎng)景,提升系統(tǒng)的性能和可擴(kuò)展性。希望本文對(duì)讀者理解和應(yīng)用Sharding JDBC有所幫助。

作者介紹

波哥,在互聯(lián)網(wǎng)行業(yè)從業(yè)10余年,先后擔(dān)任項(xiàng)目總監(jiān)及架構(gòu)師。目前專攻技術(shù),喜歡研究技術(shù)原理。技術(shù)全面,主攻Java,精通JVM底層機(jī)制及Spring全家桶底層框架原理,熟練掌握當(dāng)前主流的中間件、服務(wù)網(wǎng)格等技術(shù)原理。

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2025-04-03 09:39:14

2021-10-27 09:55:55

Sharding-Jd分庫(kù)分表Java

2022-06-22 07:32:53

Sharding分庫(kù)數(shù)據(jù)源

2020-11-06 15:30:23

分庫(kù)分表Sharding-JD數(shù)據(jù)庫(kù)

2025-02-20 08:16:23

HTMLAngleSharpDOM

2025-01-16 09:47:29

HTML利器JavaScript

2023-03-13 07:35:44

MyBatis分庫(kù)分表

2020-07-30 17:59:34

分庫(kù)分表SQL數(shù)據(jù)庫(kù)

2019-11-12 09:54:20

分庫(kù)分表數(shù)據(jù)

2025-04-03 03:55:00

2024-07-26 00:16:11

2022-07-11 08:16:47

NewSQL關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)

2021-08-31 20:21:11

VitessMySQL分庫(kù)

2023-08-11 08:59:49

分庫(kù)分表數(shù)據(jù)數(shù)據(jù)庫(kù)

2020-11-18 09:39:02

MySQL數(shù)據(jù)庫(kù)SQL

2017-07-20 17:10:38

數(shù)據(jù)庫(kù)DB分庫(kù)sharding

2025-04-01 08:45:00

2020-07-28 09:04:09

NewSQL分庫(kù)分表

2021-01-26 05:37:08

分庫(kù)分表內(nèi)存

2022-05-16 08:50:23

數(shù)據(jù)脫加密器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)