数据库分库分表sharding-jdbc实践

开始前必读

github开源地址

https://github.com/smileMrLee/sharding-jdbc-demo

本项目基于 spring boot + sharding-jdbc + mybatis + mysql搭建,用作测试验证sharding-jdbc 实现数据库分库分表。 下载启动本项目前,请先执行DDL.sql 初始化数据库。

  • DDL.sql 文件位于本项目根路径下。

  • 启动前,请先修改 mysql 连接信息,确保连接账号密码无误。

实战

集成sharding-jdbc总共需要以下几步

1. pom依赖引入sharding-jdbc 及 mybatis组件包

    <!-- mysql driver -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!-- sharding-jdbc start -->
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- sharding-jdbc end -->

2. 配置数据源

# test0数据源
sharding.jdbc.datasource.test0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.test0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.test0.jdbc-url=jdbc:mysql://127.0.0.1:3306/test0?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sharding.jdbc.datasource.test0.username=root
sharding.jdbc.datasource.test0.password=123456

…… 

# testn数据源
sharding.jdbc.datasource.test${n}.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.test${n}.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.test${n}.jdbc-url=jdbc:mysql://127.0.0.1:3306/test${n}?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sharding.jdbc.datasource.test${n}.username=root
sharding.jdbc.datasource.test${n}.password=123456

# 注意此处的"test0" 到 "test${n}" 按照实际需要配置分库需要的数据源个数。 ${n} 改为实际的库编号。 
# 虽然此处的test${n} 中的n不是必须填写数字,但是为了保持好的规范,我们强烈建议按照阿拉伯数字1~n对数据库进行编码。

3. 配置数据库database分库策略、表table分表策略

# 分库策略
# 水平拆分的数据库(表) 配置分库,分库主要取决于id列
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=test$->{id % 3}
# 分表策略 
# 其中car为逻辑表 分表主要取决于count列,⚠️此处应该选择一个均匀分布的列值,本项目为了简便才随机选择count列。
sharding.jdbc.config.sharding.tables.t_car.actual-data-nodes=test$->{0..2}.t_car_$->{0..1}
sharding.jdbc.config.sharding.tables.t_car.table-strategy.inline.sharding-column=count

4. 编码实现

  • 详细参考源码,entity 中表名使用逻辑表表名。 @TableName("t_car")

  • 在启动类添加注解 @MapperScan("com.lee.sharding.jdbc.demo.mapper")

然后编写service 和 controller进行crud

5. http调用验证

保存车辆信息:http://localhost:8080/car/save
查询车辆列表:http://localhost:8080/car/get