概述
- ShardingSphere,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。定位为轻量级Java框架。其实就是一个增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。内部改写了SQL的添加和查询规则。适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
- 目前已经进入Apache孵化器。以4.x版本为新的发布开始
如何单库分表集成
- 首先集成一个不分库只分表的模式。创建一个springboot项目,这里使用Sharding-JDBC3.0版本。使用
sharding-jdbc-spring-boot-starter
集成
pom.xml配置
1 | <parent> |
创建测试数据局test_order
。分别创建三张表t_address
, t_user0
,t_user1
。这里假设t_user这个预计随着系统的运行。公司发展很好,以后数据量会暴增。所以提前进行水平分片存储。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。这样单表数据量降下来了,mysql的B+树的检索效率就提高了
创建测试数据
1 | CREATE TABLE `t_address` ( |
下面就是基本的curd骚操作配置了
添加实体类
1 | public class User { |
创建Mapper
1 |
|
添加Controller
UserController
1 |
|
AddressController
1 |
|
AddressMapper.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
UserMapper.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
设置分片规则
- application.yml中配置具体要进行分片存储的表规则
- 行表达式标识符可以使用${…}或$->{…},但前者与Spring本身的属性文件占位符冲突,因此在Spring环境中使用行表达式标识符建议使用$->{…}。
1 | server: |
一个简单的水平分片单库分表就完成了。进行测试就发现数据分别存储到t_user0和t_user1两个表中。这里采用的事按照字段sex
取模分片存储。
如何集成分库又分表
- 既分库又分表其实只需要在配置文件修改一个分片规则即可,不用修改业务任何代码。分库分表的数据表不能用自增主键,Sharding-JDBC会自动分配一个id,默认使用雪花算法(snowflake)生成64bit的长整型数据。
1 | CREATE TABLE `t_address` ( |
修改分配规则
1 | server: |
分库又分表就完成了,测试over。
官方配置示例
数据分片
1 | sharding.jdbc.datasource.names=ds0,ds1 |
读写分离
1 | harding.jdbc.datasource.names=master,slave0,slave1 |
数据分片 + 读写分离
1 | sharding.jdbc.datasource.names=master0,master1,master0slave0,master0slave1,master1slave0,master1slave1 |
数据治理
1 | sharding.jdbc.datasource.names=ds,ds0,ds1 |
Sharding-JDBC不支持的项
DataSource接口
- 不支持timeout相关操作
Connection接口
- 不支持存储过程,函数,游标的操作
- 不支持执行native的SQL
- 不支持savepoint相关操作
- 不支持Schema/Catalog的操作
- 不支持自定义类型映射
Statement和PreparedStatement接口
- 不支持返回多结果集的语句(即存储过程,非SELECT多条数据)
- 不支持国际化字符的操作
对于ResultSet接口
- 不支持对于结果集指针位置判断
- 不支持通过非next方法改变结果指针位置
- 不支持修改结果集内容
- 不支持获取国际化字符
- 不支持获取Array
官方文档
- https://shardingsphere.apache.org/document/legacy/3.x/document/cn/overview/