为了账号安全,请及时绑定邮箱和手机立即绑定

ShardingJDBC分库分表配置入门详解

标签:
Java 数据库
概述

本文介绍了ShardingJDBC分库分表配置入门的相关内容,包括ShardingJDBC的基本概念、作用与优势。文章详细讲解了ShardingJDBC的环境准备、基本配置步骤和实战案例,帮助读者快速上手分库分表配置。

ShardingJDBC简介

ShardingJDBC是阿里巴巴开源的一个分布式数据库中间件,它实现了分库分表的功能,可以将数据分散存放在多个数据库实例中,从而提升系统的扩展性和性能。ShardingJDBC支持多种数据库类型,并且提供了丰富的API和配置选项,使得数据库操作变得更加灵活和高效。

ShardingJDBC的基本概念

ShardingJDBC的核心概念包括数据源、分片策略以及规则配置等。

  • 数据源:指存储数据的物理数据库,可以是单个数据库实例,也可以是多个数据库实例组成的集群。
  • 分片策略:定义了数据如何分布在不同的数据源上。ShardingJDBC支持多种分片策略,例如范围分片、哈希分片等。
  • 规则配置:配置如何将数据库逻辑表映射到实际的物理表上。可以定义逻辑表、数据源、分片键(Sharding Key)等信息。
ShardingJDBC的作用与优势

ShardingJDBC的主要作用是实现数据库的水平拆分,通过将数据分散到多个物理数据库中,可以有效地减少单个数据库实例的压力,提高系统的整体性能。此外,ShardingJDBC还提供了丰富的配置选项,使得开发者可以灵活地控制数据分布策略,满足不同的业务需求。

ShardingJDBC的优势包括:

  • 支持多种数据库:ShardingJDBC支持MySQL、Oracle、SQL Server等多种数据库类型。
  • 灵活的配置选项:可以通过配置文件或API的方式,灵活定义分片策略和规则。
  • 高性能:采用轻量级的设计,对数据库的性能影响较小。
  • 易于集成:可以无缝地集成到现有的项目中,不需要修改业务代码。
环境准备

在使用ShardingJDBC之前,需要准备相应的环境。主要包括JDK版本要求、数据库环境搭建以及ShardingJDBC的依赖配置。

JDK版本要求

ShardingJDBC支持Java 8及以上版本。为了确保兼容性和性能,建议使用最新版本的JDK。

数据库环境搭建

在本例中,我们将使用MySQL作为示例数据库。首先,需要安装并启动MySQL服务器,并创建相应的数据库和表结构。

  1. 安装MySQL:
sudo apt-get update
sudo apt-get install mysql-server
  1. 启动MySQL服务:
sudo systemctl start mysql
  1. 创建数据库和表结构:
CREATE DATABASE shardingdb0;
USE shardingdb0;

CREATE TABLE t_order_0 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);

CREATE TABLE t_order_1 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);

CREATE DATABASE shardingdb1;
USE shardingdb1;

CREATE TABLE t_order_0 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);

CREATE TABLE t_order_1 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);
ShardingJDBC依赖配置

在项目中引入ShardingJDBC依赖。可以使用Maven或Gradle进行依赖管理。

Maven配置

pom.xml文件中添加以下依赖:

<dependencies>
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
  </dependency>
  <dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
  </dependency>
</dependencies>

Gradle配置

build.gradle文件中添加以下依赖:

dependencies {
  implementation 'com.baomidou:mybatis-plus-boot-starter:3.4.2'
  implementation 'mysql:mysql-connector-java:8.0.23'
  implementation 'com.dangdang:sharding-jdbc-spring-boot-starter:4.1.1'
}

数据源配置

数据源配置是ShardingJDBC的基础,定义了可用的数据源列表以及每个数据源的连接信息。这些信息通常存储在配置文件中,例如application.ymlapplication.properties

示例配置(application.yml):

spring:
  datasource:
  ds1:
    url: jdbc:mysql://localhost:3306/shardingdb0?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: -1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20
    filter: stat
  ds2:
    url: jdbc:mysql://localhost:3306/shardingdb1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: -1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20
    filter: stat
基本配置步骤

ShardingJDBC的核心配置步骤包括数据源配置、规则配置以及分片策略配置。每一个步骤都非常重要,它们共同决定了如何将逻辑表映射到实际的物理表上,以及数据如何分布在不同的数据源中。

数据源配置

数据源配置是ShardingJDBC的基础,定义了可用的数据源列表以及每个数据源的连接信息。这些信息通常存储在配置文件中,例如application.ymlapplication.properties

示例配置(application.yml):

spring:
  datasource:
  ds1:
    url: jdbc:mysql://localhost:3306/shardingdb0?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: -1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20
    filter: stat
  ds2:
    url: jdbc:mysql://localhost:3306/shardingdb1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: -1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20
    filter: stat
规则配置

规则配置定义了如何将逻辑表映射到实际的物理表上,以及如何对查询进行路由和分片。规则配置文件通常使用YAML或Properties格式,具体格式由ShardingJDBC版本决定。

示例配置(sharding.yaml):

schema:
  db0:
  dataSources:
    ds0:
      dataSourceName: ds1
    ds1:
      dataSourceName: ds2
  tables:
    t_order:
      actualDataNodes: ds$->{0..1}.t_order_$->{0..1}
      tableStrategy:
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: t_order_inline
  shardingAlgorithms:
    t_order_inline:
      type: INLINE
      props:
        logicTable: t_order
        dataSourceNodes: ds0
        shardCount: 2
        shardingKey: user_id
        algorithmExpression: user_id % 2
分片策略配置

分片策略定义了数据如何分布在不同的数据源上。ShardingJDBC支持多种分片策略,例如范围分片、哈希分片等。在规则配置文件中,可以通过定义不同的分片算法来实现不同的分片策略。

示例配置(sharding.yaml):

schema:
  db0:
  dataSources:
    ds0:
      dataSourceName: ds1
    ds1:
      dataSourceName: ds2
  tables:
    t_order:
      actualDataNodes: ds$->{0..1}.t_order_$->{0..1}
      tableStrategy:
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: t_order_inline
  shardingAlgorithms:
    t_order_inline:
      type: INLINE
      props:
        logicTable: t_order
        dataSourceNodes: ds0
        shardCount: 2
        shardingKey: user_id
        algorithmExpression: user_id % 2
实战案例

本节将通过一个实际案例来演示如何使用ShardingJDBC进行分库分表的配置和测试。

创建分库分表的数据库和表结构

在本案例中,我们将创建两个数据库实例,每个实例中包含两个分表t_order_0t_order_1

  1. 创建数据库实例和表结构:
CREATE DATABASE shardingdb0;
USE shardingdb0;

CREATE TABLE t_order_0 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);

CREATE TABLE t_order_1 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);

CREATE DATABASE shardingdb1;
USE shardingdb1;

CREATE TABLE t_order_0 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);

CREATE TABLE t_order_1 (
  id INT PRIMARY KEY,
  user_id INT,
  status VARCHAR(50)
);
编写配置文件

在项目中编写规则配置文件sharding.yaml,定义逻辑表和分片策略。

schema:
  db0:
  dataSources:
    ds0:
      dataSourceName: ds1
    ds1:
      dataSourceName: ds2
  tables:
    t_order:
      actualDataNodes: ds$->{0..1}.t_order_$->{0..1}
      tableStrategy:
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: t_order_inline
  shardingAlgorithms:
    t_order_inline:
      type: INLINE
      props:
        logicTable: t_order
        dataSourceNodes: ds0
        shardCount: 2
        shardingKey: user_id
        algorithmExpression: user_id % 2
测试分库分表功能

编写测试代码,验证分库分表功能是否正常工作。测试代码展示了如何插入和查询数据。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

@SpringBootTest
public class ShardingJdbcTest {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Autowired
  private OrderService orderService;

  @Test
  public void testInsert() {
    // 插入数据
    Order order = new Order();
    order.setId(1);
    order.setUserId(1);
    order.setStatus("INSERTED");
    orderService.insert(order);

    // 查询数据
    List<Order> orders = orderService.selectByUserId(1);
    for (Order o : orders) {
      System.out.println(o);
    }
  }
}
import com.baomidou.mybatisplus.extension.service.IService;

public interface OrderService extends IService<Order> {
  void insert(Order order);
  List<Order> selectByUserId(Integer userId);
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
  @Override
  public void insert(Order order) {
    super.save(order);
  }

  @Override
  public List<Order> selectByUserId(Integer userId) {
    return super.list(new QueryWrapper<Order>().eq("user_id", userId));
  }
}
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_order")
public class Order {
  private Integer id;
  private Integer userId;
  private String status;
}
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface OrderMapper extends BaseMapper<Order> {
}
常见问题与解决方案

在使用ShardingJDBC的过程中,可能会遇到各种配置错误和运行时异常。本节将介绍一些常见的问题及其解决方案。

配置错误排查

常见配置错误包括数据源配置错误、规则配置错误等。

  1. 数据源配置错误:确保数据源连接信息正确无误,特别是URL、用户名和密码。
  2. 规则配置错误:确保逻辑表、分片键和分片策略定义一致,避免分片逻辑冲突。

示例配置错误排查:

  • 数据源配置错误
spring:
  datasource:
  ds1:
    url: jdbc:mysql://localhost:3306/shardingdb0?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: -1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20
    filter: stat
  ds2:
    url: jdbc:mysql://localhost:3306/shardingdb1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: -1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20
    filter: stat
  • 规则配置错误
schema:
  db0:
  dataSources:
    ds0:
      dataSourceName: ds1
    ds1:
      dataSourceName: ds2
  tables:
    t_order:
      actualDataNodes: ds$->{0..1}.t_order_$->{0..1}
      tableStrategy:
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: t_order_inline
  shardingAlgorithms:
    t_order_inline:
      type: INLINE
      props:
        logicTable: t_order
        dataSourceNodes: ds0
        shardCount: 2
        shardingKey: user_id
        algorithmExpression: user_id % 2
运行时常见异常解析

常见的运行时异常包括SQL执行异常、数据库连接异常等。

  1. SQL执行异常:可能的原因包括SQL语法错误、数据类型不匹配、分片策略冲突等。
  2. 数据库连接异常:可能的原因包括数据库服务未启动、网络连接问题、数据库连接超时等。

示例异常处理:

  • SQL执行异常
try {
  jdbcTemplate.update("INSERT INTO t_order (id, user_id, status) VALUES (?, ?, ?)", 1, 1, "INSERTED");
} catch (Exception e) {
  System.err.println("SQL execution failed: " + e.getMessage());
}
  • 数据库连接异常
try {
  jdbcTemplate.queryForList("SELECT * FROM t_order WHERE user_id = ?", 1);
} catch (Exception e) {
  System.err.println("Database connection failed: " + e.getMessage());
}
总结与进阶方向

通过本篇文章的学习,您应该已经掌握了ShardingJDBC的基本配置和使用方法。ShardingJDBC提供了丰富的配置选项和API,使得数据库操作变得更加灵活和高效。

学习心得
  • 数据库水平拆分:ShardingJDBC通过分库分表的方式,有效地实现了数据库的水平拆分,提升了系统的扩展性和性能。
  • 配置灵活性:ShardingJDBC允许通过配置文件或API的方式灵活定义分片策略,满足不同的业务需求。
推荐进阶学习资源

通过深入学习和实践,您可以更好地利用ShardingJDBC来构建分布式数据库系统,提升系统的性能和可靠性。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消