SpringBoot使用Sharding-JDBC分库分表

1.有关Sharding-JDBC

有关Sharding-JDBC介绍这里就不在多说,之前Sharding-JDBC是当当网自研的关系型数据库的水平扩展框架,现在已经捐献给Apache

目前貌似还不能从Maven仓库下载依赖,需要手动下载源码打包使用,所以本文使用的还是当当网的依赖。

2.本文场景

2.1 数据库

接下来介绍一下本文的场景,本文是分别创建了2个数据库database0和database1。其中每个数据库都创建了2个数据表,goods_0和goods_1,如图所示。这里蓝色的代表database0中的表,红色的代表database1中的表。绿色goods表是虚拟表(图画的比较丑,审美不好,凑合看吧)。

springboot hibernate 多表继承_apache

2.2 分库

本文分库样例比较简单,根据数据库表中字段goods_id的大小进行判断,如果goods_id大于20则使用database0,否则使用database1。

2.3 分表

分样例比较简单,根据数据库表中字段goods_type的数值的奇偶进行判断,奇数使用goods_1表,偶数使用goods_0表。

2.4 代码流程

流程大致是这样,在应用程序中我们操作虚拟表goods,但是当真正操作数据库的时候,会根据我们的分库分表规则进行匹配然后操作。

3.代码实现

本文使用SpringBoot2.0.3,SpringData-JPA,Druid连接池,和当当的sharding-jdbc。

3.1 建表SQL

创建表和数据库的SQL如下所示。

3.2 依赖文件

新建项目,加入当当的sharding-jdbc-core依赖和druid连接池,完整pom如下所示。

3.3 配置信息

在配置信息中配置了两个数据库的信息和JPA的简单配置。

3.4 启动类

启动类加入了@EnableAutoConfiguration取出数据库自动配置,使用@EnableTransactionManagement开启事务,使用@EnableConfigurationProperties注解加入配置实体,启动类完整代码请入所示。

3.5 实体类和数据库操作层

这里没什么好说的,就是简单的实体和Repository,只不过在Repository内加入between方法和in方法用于测试,代码如下所示。

Goods实体类。

GoodsRepository类。

3.6 数据库配置

本文使用了两个实体来接收数据库信息,并且创建数据源,也可以采用别的方式。首先看一下Database0Config和Database1Config两个类的代码。

Database0Config类。

Database1Config类。

接下来新建DataSourceConfig用于创建数据源和使用分库分表策略,其中分库分表策略会调用分库算法类和分表算法类,DataSourceConfig类代码如下所示。

3.7 分库分表算法

由于这里只是简单的分库分表样例,所以分库类这里实现SingleKeyDatabaseShardingAlgorithm类,采用了单分片键数据源分片算法,需要重写三个方法,分别是:

  • doEqualSharding:SQL中==的规则。
  • doInSharding:SQL中in的规则。
  • doBetweenSharding:SQL中between的规则。

本文分库规则是基于值大于20则使用database0,其余使用database1,所以简单if,else就搞定了,分库算法类DatabaseShardingAlgorithm代码如下所示。

分表和分库类似,无非就是实现的类不一样,实现了SingleKeyTableShardingAlgorithm类,策略使用值奇偶分表,分表算法类TableShardingAlgorithm如代码清单所示。

3.8 Controller

接下来创建一个Controller进行测试,保存方法使用了插入40条数据,根据我们的规则,会每个库插入20条,同时我这里还创建了三个查询方法,分别是查询全部,between查询,in查询,还有删除全部方法。Controller类代码如下所示。

4.测试

启动应用,在浏览器或HTTP请求工具访问http://localhost:8080/save,如图所示,返回success。

springboot hibernate 多表继承_bc_02

接下来在测试一下查询方法,访问http://localhost:8080/select,如图所示,可以看到插入数据没问题。

springboot hibernate 多表继承_spring_03

然后查看一下数据库,首先看database0,如图,每个表都有十条数据,如下所示。

springboot hibernate 多表继承_apache_04

springboot hibernate 多表继承_apache_05

springboot hibernate 多表继承_bc_06

接下来看database1,如下所示。

springboot hibernate 多表继承_apache_07

springboot hibernate 多表继承_bc_08

springboot hibernate 多表继承_spring_09


SpringBoot使用Sharding-JDBC分库分表