首页 > 编程语言 >什么是分库分表?用Java手写一个分库分表组件

什么是分库分表?用Java手写一个分库分表组件

时间:2024-03-15 18:31:22浏览次数:32  
标签:分库 Java 数据库 并发 拆分 分表 数据

分库分表

分库分表路由组件的主要功能是负责处理数据在多个数据库和表之间的分配和路由。在分库分表的场景中,数据会根据一定的策略(如业务逻辑、哈希算法等)被分散到不同的数据库或表中,以提高系统的并发处理能力和扩展性。

具体来说,分库分表路由组件需要完成以下任务:

  • 数据源的配置和加载:根据配置信息,获取到需要使用的多个数据源,并进行相应的加载和初始化。
  • 数据源的动态切换:根据数据的路由规则,动态地在多个数据源之间进行切换,确保数据能够正确地写入或读取到对应的数据库或表中。
  • 数据路由规则的实现:根据业务需求和系统架构,实现数据的路由规则。这通常涉及到对数据的哈希、取模等操作,以确定数据应该被分配到哪个数据库或表中。
  • 数据库表寻址操作:对于需要查询的数据,路由组件需要根据查询条件确定应该到哪个数据库或表中进行查询。这通常涉及到对查询条件的解析和索引计算。
    此外,为了确保数据的正确性和一致性,分库分表路由组件还需要处理一些复杂的情况,如跨库事务、数据迁移、数据备份等。

什么时候需要分库分表

在以下几种情况下,通常需要考虑分库分表:

  • 数据量大:当数据量超过单个数据库实例的处理能力时,分库分表可以分散数据负载,提高系统性能和扩展性。此外,随着数据库表以及表中的数据量不断增加,数据库的处理能力可能会下降,而分库分表能有效解决这一问题。
  • 高并发访问:当应用程序需要支持大量并发用户访问,且单个数据库实例无法满足高并发需求时,分库分表可以分散并发访问压力,提高系统的响应速度和吞吐量。
  • 数据隔离:当需要对数据进行隔离管理,例如将用户数据、日志数据、统计数据等存储在不同的数据库或表中时,分库分表可以实现数据的逻辑隔离,便于管理和维护。
  • 此外,如果在对硬件、网络、数据库表结构以及表之间的关系进行合理设计,对索引进行优化后,数据量仍然快速增长,日常运维受到影响,例如数据的备份耗时较长,对数据的修改造成锁的长时间等待等,这时也需要考虑分库分表。

应用场景

分库分表是数据库架构设计中常见的优化手段,用于解决单一数据库性能瓶颈、数据量过大以及高并发访问等问题。在实际项目中,有许多成功应用分库分表的案例。这些项目通常涉及大型网站、应用平台或高并发业务场景,需要处理大量数据和支持高并发访问。

例如,一些电商平台可能会采用分库分表来优化其订单系统、用户系统或商品系统等关键业务模块。通过将数据分散到多个数据库或表中,可以提高系统的吞吐量和响应速度,同时保证数据的可靠性和一致性。

另外,一些金融、物流、社交等领域的企业也可能采用分库分表技术来提升其业务系统的性能和稳定性。这些项目通常需要根据具体业务需求和系统架构来设计分库分表的策略,并进行相应的开发和实施工作。

需要注意的是,分库分表虽然可以解决一些性能问题,但也会带来一定的复杂性和挑战。因此,在实施分库分表时,需要充分考虑业务需求、数据量、并发访问量等因素,并选择合适的分库分表策略和技术方案。同时,还需要进行充分的测试和优化工作,确保系统的稳定性和性能达到预期目标。

总之,分库分表在项目中的应用非常广泛,是数据库架构设计中的重要优化手段之一。具体项目名称可能因行业和业务差异而有所不同,但其核心目的都是为了解决数据库性能瓶颈和数据量过大的问题。

总的来说,当数据量过大、并发访问需求高或需要进行数据隔离时,通常需要采用分库分表策略来优化数据库性能和管理。但在实际操作中,也需要考虑到业务的实际情况和需求,以及分库分表可能带来的复杂性,进行权衡和决策。

分库分表策略

1.垂直拆分
(1) 数据库垂直拆分
根据业务拆分,如图,电商系统,拆分成订单库,会员库,商品库
在这里插入图片描述

(2)表垂直拆分

根据业务去拆分表,如图,把user表拆分成user_base表和user_info表,use_base负责存储登录,user_info负责存储基本用户信息
在这里插入图片描述

2.水平拆分
(1) 数据库水平拆分
在这里插入图片描述

如图,按会员库拆分,拆分成会员1库,会员2库,以userId拆分,userId尾号0-5为1库
6-9为2库,还有其他方式,进行取模,偶数放到1库,奇数放到2库

(2) 表水平拆分
在这里插入图片描述

如图把users表拆分成users1表和users2表,以userId拆分,进行取模,偶数放到users1表,奇数放到users2表

分库分表带来的问题

  • 分布式事务
  • 跨库join查询
  • 分布式全局唯一id
  • 开发成本 对程序员要求高

开源组件

目前市面上使用较多的是,mycat及sharding-jdbc。mycat属于中间层代理类中间件、sharding-jdbc属于应用层依赖类中间件

手写分库分表组件

分享一个自定义的分库分表开源组件学习项目,可供学习

相关阅读

标签:分库,Java,数据库,并发,拆分,分表,数据
From: https://blog.csdn.net/Supreme7/article/details/136742885

相关文章

  • Java学习第二天——基础语法
    Java基础语法数据类型强类型语言要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用!!!Java的数据类型分类基本类型(primitivetype)1.数值类型整数类型浮点类型字符类型(只占有两个字节)2.boolean类型:占一位,其值为true或者false引用类型(referencetype)类、接......
  • Java基础知识篇02——Java基本语法
    一、数据类型定义:就是用了保存数据的一个类型,一种数据类型,只能保存该类型数据值作用:只有了解数据类型,才能选择合适的类型存放数据,才能更好的利用计算机硬件资源(内存和硬盘等)。不同的数据类型存放数据大小是不同的。数据类型的使用方式就是用来声明一个变量,装数据的。......
  • 程序人生——Java枚举和注解使用建议
    目录引出枚举和注解建议83:推荐使用枚举定义常量建议84:使用构造函数协助描述枚举项建议85:小心switch带来的空值异常建议86:在switch的default代码块中增加AssertionError错误建议87:使用valueOf前必须进行校验建议88:用枚举实现工厂方法模式更简洁建议89:枚举项的数量控制......
  • 程序人生——Java泛型和反射的使用建议
    目录引出泛型和反射建议93:Java的泛型是类型擦除的建议94:不能初始化泛型参数和数组建议95:强制声明泛型的实际类型建议96:不同的场景使用不同的泛型通配符建议97:警惕泛型是不能协变和逆变的建议98:建议采用的顺序是List,List,List建议99:严格限定泛型类型采用多重界限建议1......
  • Java访问者模式源码剖析及使用场景
    访问者模式一、介绍二、报表系统开发三、MyBatis中如何使用访问者模式?一、介绍Java中的访问者(Visitor)模式是一种行为型设计模式,它将数据结构与数据操作分离,使得在不修改数据结构的情况下可以增加新的操作。该模式主要包含以下几个角色:抽象访问者(Visitor):定......
  • java上传文件到FTP制定文件夹
    JAVA上传文件到FTP/***@ClassNameFTPLoad*@DescriptionTODO*@Authordell*@Date2024/3/1415:56*@Version1.0**/importcn.hutool.core.io.FileUtil;importcn.hutool.json.JSONObject;importcn.hutool.json.JSONUtil;importorg.apache.commons.net.......
  • javabean:VO和POJO的区别?
    实体类都是JavaBean的一种 实际上没区别 功能都一样 使用的时候区别(VO一般在命名结尾有大写VO 以做区别)参考:https://blog.csdn.net/huang_ftpjh/article/details/90232922关于java的几种对象(PO,VO,DAO,BO,POJO,DTO)解释摘抄参考2:https://blog.csdn.net/weixin_6938139......
  • idea开发java必备插件
    1.Lombok 这个大家都熟悉,通过注解的形式代替了很多生成式的代码,如Getter、Setter方法、ToString方法,构造函数等,使你的类更精简和美观,没有太多的冗余代码。2.Maven Helper,使用maven引入依赖的必备,分析和排除冲突依赖关系的简单方法,显示maven依赖树,查询引用的依赖关系以及跳转......
  • Java题目-数组计算-中位数- 圆类的构造-时间计算-学生类设计
    第一题:数组计算题目描述:编写Java程序,计算两个整型数组的和、差、乘积、商的整数部分及大小关系。定义如下:和:两个数组对应元素的和,若元素缺失,则补0;差:第一个数组和第二个数组对应元素的差,若元素缺失,则补0;乘积:两个数组对应元素的积,若元素缺失,则计0;除:第一个数组元素除以第二......
  • Mac下配置Java开发环境以Java 8 为例
    下面以Java8的安装和配置为例。Step1:下载Java安装包系统:MACOSX10.10.1Java8安装包:jdk-8u31-macosx-x64.dmgStep2:安装并配置Java环境:(1)打开Shell输入vi~/.bash_profile(2)i>输入>esc>:wq保存JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Conte......