Spring Boot 2.0 整合Sharding-jdbc实现水平分表、水平分库


1、概述

     ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。

他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 它与NoSQL和NewSQL是并存而非互斥的关系。

官网地址:https://shardingsphere.apache.org/

1.1 重点介绍:

Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

支持项:

  • 数据分片
  • 读写分离
  • 强制路由
  • 编排治理
  • 分布式事务

不支持项:

DataSource接口

  • 不支持timeout相关操作

Connection接口

  • 不支持存储过程,函数,游标的操作
  • 不支持执行native的SQL
  • 不支持savepoint相关操作
  • 不支持Schema/Catalog的操作
  • 不支持自定义类型映射

Statement和PreparedStatement接口

  • 不支持返回多结果集的语句(即存储过程,非SELECT多条数据)
  • 不支持国际化字符的操作

对于ResultSet接口

  • 不支持对于结果集指针位置判断
  • 不支持通过非next方法改变结果指针位置
  • 不支持修改结果集内容
  • 不支持获取国际化字符
  • 不支持获取Array

架构模型:

另外中文文档下载地址:https://shardingsphere.apache.org/pdf/shardingsphere_docs_cn.pdf

2、水平分表是在同一个数据内,把同一个表的数据按一定规则拆到多个表中。

     水平分库是在同一个数据,根据规则,保存到不同的库中,实现分库。

3、开发工具 idea 、mysql 8      架构:spring boot、mybatis plus、mysql、 lombok、druid

4、首先初始化一个springboot项目,然后修改pom文件

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.0-RC1</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.23</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.2</version>
    </dependency>

 



5、启动类加入mapper扫描

6、编写pojo

/**
 * @Author: dkx
 * @Date: 9:58 2020/8/19
 * @Desc:
 */
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
}


编写mapper
1 /**
2  * @Author: dkx
3  * @Date: 9:57 2020/8/19
4  * @Desc:
5  */@Repository
6 public interface UserMapper extends BaseMapper<User> {
7 
8 }

 



7、编写分表规则(可参考官网)
# 配置真实数据源
spring.shardingsphere.datasource.names=ds0,ds1
spring.main.allow-bean-definition-overriding=true
#打开sql控制台输出日志
spring.shardingsphere.props.sql.show=true
# 配置第 1 个数据源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
# 配置第 2 个数据源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
# 配置 user 表规则
spring.shardingsphere.rules.sharding.tables.user.actual-data-nodes=ds$->{0..1}.user_$->{0..1}
#如果先执行分表可打开下面注释,把上面的注释关闭
#spring.shardingsphere.rules.sharding.tables.user.actual-data-nodes=ds0.user_$->{0..1}
#主键策略 雪花算法
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
# 配置分表策略 主键取模 0在0表  1在1表
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id % 2}
# 配置分库策略 年纪取模0在0库 1在1库
spring.shardingsphere.sharding.tables.user.database-strategy.inline.sharding-column=age
spring.shardingsphere.sharding.tables.user.database-strategy.inline.algorithm-expression=ds$->{age % 2}

 


8,提前在mysql中创建好对应的库和表语句,参考pojo类,此处省略。。。。自行百度

 

 

9、编写test类
class DemoApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        User user =  new User();
        user.setName("dkx_k");
        user.setAge(3);
        userMapper.insert(user);
    }
}

 



10.控制台输出日志

 

 

11.查看数据库

 

 

10.如有不懂的可联系或留言,看到后第一时间回复。

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM