在上文中,我们讲解了分布式环境下的分库分表,从概念及案例上分析了何为分库分表及其优缺点。
我说分布式之分库分表
从本文开始我们一起学习一下如何使用当前比较成熟的分库分表框架 Sharding-JDBC 实现分库分表。
什么是Sharding-JDBC
Sharding-JDBC是分布式数据中间件Sharding-Sphere中的重要组成部分,官方的介绍如下:
Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
Sharding-JDBC 是Sharding-Sphere的第一款产品,也是最接近开发者的一款分库分表中间件,很有代表性,也值得我们深入的学习与应用。
Sharding-JDBC官方文档地址
这里我贴出官方的文档地址,版本为3.x,有问题先看文档是比较直接快速准确的trouble-shooting方式。
如何使用Sharding-JDBC3.x 实现分库分表
简单了解一下背景之后,我们用一个案例先把它用起来,直观地感受一下Sharding-JDBC的魅力,后续我们会对它做进一步的讲解。
由于目前的后端Java开发主要以Spring Boot为主,因此我将主要依据Spring Boot的2.x进行讲解。
建立数据库表
首先建立一个4库8表的数据库结构。数据库名为db_00--db_03,建立一个简单的订单表名为t_order_0000-t_order_0001,每个库中两张表
表结构比较简单,因为我们的目的是尽快的将框架用起来,太复杂的表结构容易让我们陷入业务中而偏离了我们的主旨。
订单表t_order的建表语句如下:
-- ----------------------------
-- Table structure for t_order_0000
-- ----------------------------
DROP TABLE IF EXISTS `t_order_0000`;
CREATE TABLE `t_order_0000` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) DEFAULT NULL,
`order_id` bigint(20) DEFAULT NULL,
`user_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1239 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for t_order_0001
-- ----------------------------
DROP TABLE IF EXISTS `t_order_0001`;
CREATE TABLE `t_order_0001` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) DEFAULT NULL,
`order_id` bigint(20) DEFAULT NULL,
`user_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1239 DEFAULT CHARSET=utf8;
在每个分库中均建立表t_order_0000,t_order_0001
数据库结构如下
db_00--
|--t_order_0000
|--t_order_0001
db_01--
|--t_order_0000
|--t_order_0001
db_02--
|--t_order_0000
|--t_order_0001
db_03--
|--t_order_0000
|--t_order_0001
宏观上我们就有了8个数据节点,如下:
db_00.t_order_0000, db_00.t_order_0001
db_01.t_order_0000, db_01.t_order_0001
db_02.t_order_0000, db_02.t_order_0001
db_03.t_order_0000, db_03.t_order_0001
建立demo工程
这里直接使用IDEA的spring-boot-initializer建立了一个demo工程,工程名为snowalker-shardingjdbc-demo,文章末尾会放上demo工程的github地址。
工程的结构如下:

引入sharding-jdbc-spring-boot-starter依赖如下
<!-- sharding-sphere -->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
数据库访问组件使用mybatis,这里直接使用了mybatis-spring-boot-starter
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
完整的pom.xml内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.snowalker.shardingjdbc</groupId>
<artifactId>snowalker-shardingjdbc-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>snowalker-shardingjdbc-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<mybatis-spring-boot-starter-version>1.3.2</mybatis-spring-boot-starter-version>
<druid-version>1.1.6</druid-version>
<sharding-jdbc-version>3.0.0</sharding-jdbc-version>
<jasypt-spring-boot-version>1.14</jasypt-spring-boot-version>
<fastjson-version>1.2.28</fastjson-version>
<common-lang3-version>3.8</common-lang3-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- sharding-sphere -->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${sharding-jdbc-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot-starter-version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies&