Springboot使用sharedingjdbc实现分库分表

 更新时间:2024年07月13日 09:06:03   作者:可乐cc呀  
这篇文章主要介绍了Springboot使用sharedingjdbc实现分库分表,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、简介

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。

目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。

开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。

二、使用注意事项

  • 使用版本问题,不同版本之间存在差异较大(参数),请参考官方文档,切记不可随意百度
  • update 时,不可对分片字段进行更新(分片字段必须在规则上保持固定)
  • 5.1.0版本使用shardingsphere-jdbc-core-spring-boot-starter时,并且使用druid时,需要加dbcp依赖
  • 时间字段作为分片字段时,需要使用date类型,不可使用localDataTime 或者localDate类型
  • 数据分片后主键自增问题,需要使用分布式主策略,例如利用redis自增主键,雪花算法,UUID等
  • 分页查询跨表较大时候,shareding会进行表的union 操作,可能会造成数据瓶颈(业务上做处理)
  • 不支持自动建表,自动分片功能需自行编码
  • 部分复杂查询不支持,请参考官网:https://shardingsphere.apache.org/document/5.1.0/cn/user-manual/shardingsphere-jdbc/unsupported/

三、项目使用

添加pom依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
</dependency>
<!-- ShardingJDBC 5.1.0使用druid连接池需要加dbcp依赖 -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-dbcp</artifactId>
</dependency>

yml配置信息

spring:
    ### 处理连接池冲突 #####
    main:
        allow-bean-definition-overriding: true
    shardingsphere:
        # 是否启用 Sharding
        enabled: false
        # 打印sql
        props:
          sql-show: false
        datasource:
            names: ds0
            ds0:
                type: com.alibaba.druid.pool.DruidDataSource
                driver-class-name: com.mysql.cj.jdbc.Driver
#                url: jdbc:mysql://123.57.164.186:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#                username: root
#                password: JoygisIot@2023
                url: jdbc:mysql://123.57.23.160:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                username: root
                password: JoygisIot@2023
                # 数据源其他配置
                initialSize: 5
                minIdle: 5
                maxActive: 20
                maxWait: 60000
                timeBetweenEvictionRunsMillis: 60000
                minEvictableIdleTimeMillis: 300000
                validationQuery: SELECT 1 FROM DUAL
                testWhileIdle: true,
                testOnBorrow: false
                testOnReturn: false
                poolPreparedStatements: true
                # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
                #filters: stat,wall,log4j
                maxPoolPreparedStatementPerConnectionSize: 20
                useGlobalDataSourceStat: true
                connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
        rules:
            sharding:
                # 表策略配置
                tables:
                    # t_user 是逻辑表
                    b_compaction_data:
                        # 配置数据节点,这里是按月分表
                        # 示例1:时间范围设置在202201 ~ 210012
                        # actualDataNodes: mydb.t_user_$->{2022..2100}0$->{1..9},mydb.t_user_$->{2022..2100}1$->{0..2}
                        # 示例2:时间范围设置在202201 ~ 202203
                        #actualDataNodes: ds${0..1}.tmp_order_item
                        actualDataNodes: ds0.b_compaction_data
                        tableStrategy:
                            complex:
                                sharding-columns: gps_time,sn
                                algorithm-class-name:
                                shardingAlgorithmName: time-sn-sharding-altorithm
                        keyGenerateStrategy:
                            column: id
                            keyGeneratorName: compaction-data-id
                # 分片算法配置
                keyGenerators:
                    compaction-data-id:
                        type: 'INCREMENT'
                shardingAlgorithms:
                    time-sn-sharding-altorithm:
                        # 类型:自定义策略
                        type: CLASS_BASED
                        props:
                            # 分片策略
                            strategy: complex
                            # 分片算法类
                            algorithmClassName: com.joygis.sharding.algorithm.ComplexTimeAndSnShardingAlgorithm

代码配置

  • a. 自定义数据源

image.png

说明:shardingSphereDataSource 为默认数据源,如需修改配置信息,可重新定义 重新注入即可

  • b. 使用动态数据源

image.png

说明: 查询接口中,直接标记数据类型即可,如为mabatisplus 请使用@Ds注解

自定义主键策略

image.png

image.png

说明:shareding中用了大量的java spi 加载机制进行代码解耦,包括主键生成策略,spi机制此处不做介绍请自行百度,此处使用的为redis自增主键(查询中例如id比较),保证id 全局唯一,type类型必须与yml文件中保持一致

单字段分表策略

说明: 类型指定为Standard ,实现StandardShardingAlgorithm类即可,项目中因要求不同,此处代码完成但为使用,需要实现两个doshared方法,PreciseShardingValue 为精确匹配 例如 in、= 等方式,RangeShardingValue为范围匹配 例如 between,< ,> 等

单字段分表策略

说明: 如上述yml 所示配置,实现ComplexKeysShardingAlgorithm接口即可,仅一个接口ComplexKeysShardingValue 中存在两个属性,分别为范围属性及精确指定属性

自动创建表

说明: 判断表是否存在(例如本地缓存,提升速度),如果存在则不创建表,如果不存在,则直接创建表,创建完成后需要更新shareding 配置信息,详细代码 请查看ShardingAlgorithmTool.tableNameCacheReloadAll();类

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Swing 多线程加载图片(保证顺序一致)

    Java Swing 多线程加载图片(保证顺序一致)

    这篇文章主要为大家详细介绍了Java Swing 多线程加载图片,保证顺序一致,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java中的上下文加载器ContextClassLoader详解

    Java中的上下文加载器ContextClassLoader详解

    这篇文章主要介绍了Java中的上下文加载器ContextClassLoader详解,ContextClassLoader是通过Thread.currentThread().getContextClassLoader()返回该线程上下文的ClassLoader,需要的朋友可以参考下
    2023-10-10
  • java计算给定字符串中出现次数最多的字母和该字母出现次数的方法

    java计算给定字符串中出现次数最多的字母和该字母出现次数的方法

    这篇文章主要介绍了java计算给定字符串中出现次数最多的字母和该字母出现次数的方法,涉及java字符串的遍历、转换及运算相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • Java并发教程之Callable和Future接口详解

    Java并发教程之Callable和Future接口详解

    Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理,这篇文章主要给大家介绍了关于Java并发教程之Callable和Future接口的相关资料,需要的朋友可以参考下
    2021-07-07
  • spring.profiles使用的方法步骤

    spring.profiles使用的方法步骤

    本文主要介绍了spring.profiles使用与spring.profiles.active和spring.profiles.include区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • IDEA创建SpringBoot项目整合mybatis时mysql-connector-java报错异常的详细分析

    IDEA创建SpringBoot项目整合mybatis时mysql-connector-java报错异常的详细分析

    最近工作中发现了个错误,分享给同样遇到这个问题的朋友,这篇文章主要给大家介绍了关于IDEA创建SpringBoot项目整合mybatis时mysql-connector-j报错异常的详细分析,需要的朋友可以参考下
    2023-02-02
  • Spring MVC 接口 ResponseBodyAdvice 及其应用最佳实践记录

    Spring MVC 接口 ResponseBodyAdvice 及其应用最佳实

    ResponseBodyAdvice 是 Spring MVC 提供的一个强大接口,允许你在响应体被写入 HTTP 响应之前对其进行全局处理,下面我将全面介绍它的工作原理、使用场景和最佳实践,感兴趣的朋友一起看看吧
    2025-04-04
  • Java8时间api之LocalDate/LocalDateTime的用法详解

    Java8时间api之LocalDate/LocalDateTime的用法详解

    在项目中,时间的使用必不可少,而java8之前的时间api Date和Calander等在使用上存在着很多问题,于是,jdk1.8引进了新的时间api-LocalDateTime,本文就来讲讲它的具体使用吧
    2023-05-05
  • java 字符串分割的三种方法(总结)

    java 字符串分割的三种方法(总结)

    下面小编就为大家带来一篇java 字符串分割的三种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java生成条形码code128(亲测有效)

    Java生成条形码code128(亲测有效)

    这篇文章主要介绍了Java生成条形码code128,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论