热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分库分表实践-Sharding-JDBC

最近一段时间在研究分库分表的一些问题,正好周末有点时间就简单做下总结,也方便自己以后查看。关于为什么要做分库分表,什么是水平分表,垂直分表等概念,相信大家都知道,这里就不在赘述了。本文只讲述使用Sharding-JDBC做分库分表的一些实践经验,如果有错误欢迎大家指出。

最近一段时间在研究分库分表的一些问题,正好周末有点时间就简单做下总结,也方便自己以后查看。

关于为什么要做分库分表,什么是水平分表,垂直分表等概念,相信大家都知道,这里就不在赘述了。

本文只讲述使用Sharding-JDBC做分库分表的一些实践经验,如果有错误欢迎大家指出。

什么是Sharding-JDBC

分库分表实践-Sharding-JDBC

Sharding-jdbc是当当网开源的一款 客户端代理 中间件。Sharding-jdbc包含分库分片和读写分离功能。对应用的代码没有侵入型,几乎没有任何改动,兼容主流orm框架,主流数据库连接池。目前属于Apache的孵化项目ShardingSphere。

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以及任何遵循 SQL 92标准的数据库。

官方文档地址

ShardingSphere: https://shardingsphere.apache.org/

GitHub的地址: https://github.com/apache/incubator-shardingsphere

一些建议和说明

不过我这里建议大家可以简单过下官方文档,因为文档并不全面或者说感觉并不是最新的。

建议大家重点可以放在git上官方的examples

目前官方最新的版本是4.0,如果使用springboot创建,可以使用下面的依赖即可。


    org.apache.shardingsphere
    sharding-jdbc-spring-boot-starter
    4.0.0

Sharding-jdbc功能强大,但是本文重点在于下面几点,未涉及的地方可以翻阅文档查看。

1、单库分表

2、分库分表(含分库单表)

3、分表后的查询

4、分表事务处理

无论上述哪种分库亦或是分表类型,核心无非是下面几个配置:

1、配置数据源,明确你有多少个数据源

2、定义表名,分表的逻辑表名(t_order)和所有物理表名(t_order_0,t_order_1)

3、定义分库列以及分库算法

4、定义分表列以及分表算法

代码实现

单库分表

sharding-jdbc优势就是对代码没有侵入性,基本上不用动我们原来的代码,只是将相关数据库连接的配置更换为sharding的配置即可。

以我的个人实践项目为例:

原来不分表时的配置:

#项目配置
spring:
  #数据连接配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://xxx.xx.xx.xx:3306/yyms?characterEncoding=UTF-8&serverTimezOne=Asia/Shanghai
    username: xxx
    password: xxx

使用sharding后的配置

# 分表配置
spring:
  shardingsphere:
    datasource:
      names: yyms
      yyms:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://xxx.xx.xx.xx:3306/yyms?characterEncoding=UTF-8&serverTimezOne=Asia/Shanghai
        username: xx
        password: xxx
    sharding:
      tables:
        # 表名
        sys_log:
          actual-data-nodes: yyms.sys_log_$->{0..1}
          # 分表配置,根据id分表
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: sys_log_$->{id % 2}
          # 配置字段的生成策略,column为字段名,type为生成策略,sharding默认提供SNOWFLAKE和UUID两种,可以自己实现其他策略
          key-generator:
            column: id
            type: SNOWFLAKE
    props:
      sql:
        show: true

上面的配置基本上就实现了单库对sys_log表的拆分,根据id取模算法,拆分为sys_log_0和sys_log_1两张表。代码层面没有任何改动就实现了拆分,拆分后效果图如下。

分库分表实践-Sharding-JDBC

注意哦,sys_log表拆分后是实际不存在的。

当然了,使用官方的默认配置很多时候并不能满足我们的需求。

假如拿到一条数据的id后再去计算数据在哪个库,无疑对我们日常的运维维护工作造成极大的不便。这里我们可以通过一些简单的自定义开发配置实现。

比如我想要id最后一位展示数据所处表所在序号。

多库分表

先展示个多库单表的案例

spring:
  shardingsphere:
    datasource:
      names: ds0,ds1
      ds_1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://xxxxxx:3306/ds1?characterEncoding=UTF-8&serverTimezOne=Asia/Shanghai
        username: xxxx
        password: xxx
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://xxxxx:3306/ds0?characterEncoding=UTF-8&serverTimezOne=Asia/Shanghai
        username: xxxx
        password: xxxx
    sharding:
      default-data-source-name: ds0
      default-database-strategy:
        inline:
          sharding-column: id
          algorithm-expression: ds$->{id % 2}
      tables:
        sys_log:
          actual-data-nodes: ds$->{0..1}.sys_log
          key-generator:
            column: id
            type: SNOWFLAKE
            props:
              worker:
                id: 123

把单张表拆分到多个库,同样使用sys_log。效果图如下:

分库分表实践-Sharding-JDBC

其实分库分表无非就是上面两种模式的集合,具体配置的选项,可以参考官方案例配置》》》 我是链接

分库分表后的查询

select * from sys_log where id='444271380247588864'

接着上面的案例,以上面的语句为例,id为分库列,sharding经过解析后定位到对应的数据源,直接执行下面的查询。

select * from sys_log where id='444271380247588864'

假如我们的查询调节不包含分库列,以下面的语句为例:

select * from sys_log where user_name='zhangsan

执行后出现两条sql语句。我们在两个库均为5条数据,查询后的结果集为10条数据,符合我们的预期。

数据库:

分库分表实践-Sharding-JDBC

结果集:

分库分表实践-Sharding-JDBC

结论:当搜索条件含有分库列(分表列),这时候sharing会首先调用分库分表策略类,直接找到对应的数据库和对应子表。而当搜索条件不含有分库列时,这时候引擎就不会再调用策略类了,而是会直接认定目标库为全部库或表,上述案例中目标库就是,[ds0,ds1]两个数据源,既然目标库有两个,后面生成的DataNode,TableUnits,PreparedStatementUnit 将是以前数量的两倍,所以这回,引擎最终将会发起多个sql语句的并发执行,并合并最终的结果再返回。

分库分表后的事务

Sharding-Sphere同时支持XA和柔性事务,它允许每次对数据库的访问,可以自由选择事务类型。分布式事务对业务操作完全透明,极大地降低了引入分布式事务的成本。

分布式事务我感觉在官方的文档和案例中写的已经是比较完善的了,这里大家可以参考: 我是链接 官方案例实现,这里就不在赘述了。

最后是项目的参考代码: https://github.com/allanzhuo/yyms


以上所述就是小编给大家介绍的《分库分表实践-Sharding-JDBC》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • 本文介绍了在 Spring Boot 中使用 JPA 进行数据删除操作时遇到的 SQL 错误及其解决方法。错误表现为:删除操作失败,原因是无法打开 JPA EntityManager 以进行事务处理。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • Oracle ERP系统用户指南:涵盖MRP模块详细操作说明
    《Oracle ERP系统用户指南》详细介绍了MRP模块的操作流程与功能。该手册涵盖了从基础设置到高级应用的全方位指导,旨在帮助用户高效地管理和优化物料需求计划。文档编号、受控状态及生效日期等信息均在手册中明确标注,确保内容的准确性和时效性。编制人忻滢对内容进行了全面审核与确认,以保障用户的使用体验。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
author-avatar
自娱自乐GoGo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有