分库分表是解决mysql水平扩展的主要手段。网上有关策略的讨论很多,主要是hash扩展、按时间扩展、按范围扩展等等。但真正想实施分库分表的朋友们往往觉得“策略听来终觉浅,觉知此事要代码”,因此本文的主要目的是给朋友们提供一个可实现架构。
JDBCTemplate和Hibernate
大家都知道Hibernate是ORM(对象-关系数据库 mapping)意义上的第一个真正的“统治级”产品。JDBCTemplate则是对Spring对jdbc的简单封装,相对于Hibernate,工程师需要自己写sql,而不是像Hibernate那样直接操作对象解决数据库持久化的问题。因为暴露了sql,JDBCTemplate当然也不利于跨数据库(毕竟每个数据库的实现产品的sql也不竟相同)。但现在大多数互联网企业都倾向于使用JDBCTemplate,而不是Hibernate。个人认为主要原因就是性能问题,
1,为获取更好性能,往往根据不同数据库采用特有的优化方式,即使是DAO层全部用Hibernate实现,迁移数据库也不是轻松的工作。
2,使用Hibernate处理关联关系往往将大量数据信息加载到业务系统内存,而不是在数据库系统中处理,只是将最终结果返回。这样破坏了生产系统和DB的解耦,导致DB优化困难,以及生产系统的不安全。
3,分库分表对于Hibernate来说显得比较复杂
可以说第三个原因是主要的。本文会围绕JDBCTemplate来实现分库分表,如果你还在使用Hibernate,建议逐渐切换到JDCBTemplate。
分库分表策略
分库分表策略,简单来说就是根据要被持久化的数据,分配一个库或者表来读/写。因此DBSplitStrategy接口定义如下,
interface DBSplitStrategy {
String getDBName(long id); // 获取库名
String getTableSuffix(long id); // 获取表名
JdbcTemplate getIdxJdbcTemplate(long id); // 获取db jt
JdbcTemplate getIdxJdbcTemplate(String dbname); // 根据库名获取 db jt
JdbcTemplate getIdxJdbcTemplateByTable(String table); // 根据表名获取db jt
}
接口定义是围绕最基本的:key -> 逻辑库名/表名 -> 物理库名/表名
实现类
![](http://dl.iteye.com/upload/attachment/0065/0509/a62c5dc3-9181-3aba-96e0-5aee8125313c.png)
以最常见的HashSplit为例,首先我们需要几个基本的配置项:(1)基本库名,也可以叫库名前缀;(2)分库总数;(3)分表总数;(4)分库对应的物理地址,即JDBCTemplate定义
Spring 配置
<bean id="dataService" class="DBSplitStrategy">
<property name="DBNameBase" value="session_" />
<property name="splitDBCount" value="16" />
<property name="splitTbCount" value="64" />
<property name="dmJts">
<map>
<entry key="session_1" value-ref="jts1"></entry>
<entry key="session_2" value-ref="jts2"></entry>
...
有了以上配置,代码工作只需要把输入的关键词安装策略转换成逻辑库名、表名即可,伪代码如下,
public String getTableName(long id) {
long hash = getHash4split(id, splitCount);
return tbNameBase + String.valueOf(hash / shareDBCount + 1);
}
public String getDBName(long id) {
long hash = getHash4split(id, splitCount);
return dbNameBase + ( hash % shareDBCount + 1);
}
这段代码里有个有趣的逻辑,如果你的业务主键从 1 一直增长,那么分库分表的结果就是:库1,表0;库2,表0;库3,表0;..... 库1,表2;库2,表2;...
总结
Mysql分库分表,水平扩展还有很多问题这里没有涉及到,比如,
- 如果最初分配的64个分表不够用了怎么办?这是最初决定分库分表是需要考虑的重要问题,因为hash容易,rehash难。
- 这么多数据分散在不同的库表中,怎么分析和挖掘呢?
- 怎么样的分库策略更适合你呢?
本文纯属原创,欢迎引用,请注明本博地址:http://maoyidao.iteye.com/
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0065/0509/a62c5dc3-9181-3aba-96e0-5aee8125313c-thumb.png)
- 大小: 6.2 KB
分享到:
相关推荐
植物病害分割系统源码&数据集分享
PHP开发的二级域名分发系统源码 已对接易支付 PHP7.2 需要安装SG11扩展 放进根目录 解压 然后 设置伪静态 一定要先设置伪静态 要不然404 最后打开你的域名直接进入安装步骤
微信小程序学易通(仿学习通)仅供学习参考
BP回归分析.xlsx
棒球运动物体检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
叶片检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
Simpack与Abaqus联合仿真:车轨刚柔耦合模型建模全攻略,simpack与abaqus联合仿真教程 车轨刚柔耦合仿真教程 刚柔耦合模型 出simpack与abaqus联合仿真车轨刚柔耦合模型教程,包括柔性钢轨建模,fbi文件生成,钢弹簧浮置板搭建,轨道不平顺激励等,包括模型。 ,simpack; abaqus; 联合仿真; 车轨刚柔耦合; 柔性钢轨建模; FBI文件生成; 钢弹簧浮置板; 轨道不平顺激励; 刚柔耦合模型。,Simpack与Abaqus联合仿真车轨刚柔耦合模型教程
python脚本调用deepseek api 生成聊天机器人,前提需要自己购买api
魔众企业官网系统采用PHP+Mysql架构,是一款对SEO非常友好、功能全面、安全稳定、支持多终端展示并且使用起来极其简单的企业建站系统。 魔众企业官网系统,帮助企业完美展示自己的形象。 2022年08月17日魔众企业官网系统发布v5.1.0版本,增加了以下22个特性: ·[新功能] 文件上传切片最大2M,分片文件根据配置动态清除 ·[新功能] UEditorPlus升级到2.3.0 ·[新功能] 图标库新增 check-simple ·[新功能] Cookie库新增属性参数 ·[新功能] 登录界面全新改版大气美观 ·[新功能] 用户授权模块微信小程序优化 ·[新功能] 后台管理员角色新增备注字段 ·[新功能] 富文本组件新增 editor-ready 自定义事件 ·[新功能] Response新增停止执行抛出消息的方法 ·[新功能] Grid新增批量弹窗快捷操作方式 ·[新功能] Grid编辑操作名称可自定义 ·[新功能] Json组件增加高度可配置参数 ·[新功能] Type类型数据新增导出JS配置文件 ·[新功能] bodyProperties可为body标签增加属性 ·[系
"基于遗传算法GA的柔性作业车间调度问题(FJSP)求解方法研究及MATLAB代码实现",FJSP:遗传算法GA求解柔性作业车间调度问题(FJSP),提供MATLAB代码 ,FJSP; 遗传算法GA; 柔性作业车间调度; MATLAB代码; 求解。,FJSP的遗传算法GA求解MATLAB代码实现
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
.
java代码实现 心形输出
内容: 本研究观察并收集了来自苏珊沼泽图勒红潮汐恢复点(坐标:38.117843, -121.983199)的钩虾(Gammarus sp.),时间跨度为2021年1月至12月。所有观察和采集工作均在修复地点二级潮汐通道中不超过20厘米深的微咸水中进行,距离提供的GPS坐标0.25英里范围内。钩虾的采集是在加利福尼亚科学采集许可证编号S-201970002-20281-001下进行的。每月的野外观察和捕捉以5米的间隔在8个半永久性的20米样带上进行,这些样带设置在相同区域的芦苇和本地植物冠层中,其中0米表示潮汐通道边缘。我们通过使用火鸡吸管捕获离散的水池(约60克水)来测量浮游无脊椎动物的生物多样性。水样本经过0.125毫米滤网过滤后,用去离子水冲洗,并在玫瑰苯胺染色的70%乙醇溶液中保存。 该研究提供了5组数据集,详情请参见:"" ()。
基于S7-1200 PLC的西门子博途4×4立体车库控制系统:PLC组态仿真、电气原理图与IO表综合研究报告,基于plc的立体车库控制系统,西门子博途4×4立体车库控制系统,S7-1200PLC编程,wincc组态仿真,系统包括PLC组态仿真,电气原理图,PLC接线图,IO表,报告等 ,基于plc的立体车库控制; 西门子博途4x4立体车库控制系统; S7-1200PLC编程; wincc组态仿真; 控制系统组成(含PLC组态仿真); 电气原理图; PLC接线图; IO表; 报告,西门子S7-1200PLC驱动的立体车库控制系统开发与仿真研究
chromedriver-win32-135.0.7004.0 (Canary).zip
这款资源系统是一款基于PHP和MySQL开发的内容管理系统(CMS),广泛应用于资源分享、下载站点的搭建。该系统以简洁、高效、易用为特点,适合快速构建资源类网站。 核心功能 资源管理:支持多种资源类型(如软件、文档、视频等)的上传、分类、展示和下载。 用户系统:提供用户注册、登录、权限管理等功能,支持用户积分、等级制度。 SEO优化:内置SEO功能,支持自定义URL、关键词、描述等,提升搜索引擎排名。 模板管理:支持多套模板切换,用户可以根据需求自定义网站外观。 插件扩展:系统支持插件机制,用户可以通过安装插件扩展功能,如支付接口、社交分享等。 安全机制:内置防SQL注入、XSS攻击等安全机制,保障系统安全。 适用场景: 资源下载站 软件分享平台 文档分享站点 视频资源站
介绍: 在2025年,随着技术的不断进步和用户需求的多样化,社区平台的设计与功能也在不断演变。StarFree作为一款全新的唯美风格社区源码,凭借其独特的设计理念和强大的功能,迅速成为了开发者与用户关注的焦点。本文将为您详细介绍StarFree源码的特点、功能以及应用场景。 1. 唯美设计,极致视觉体验 StarFree源码以“唯美”为核心设计理念,采用了简约而不失优雅的UI设计。整体界面以柔和的色调为主,搭配流畅的动画效果,为用户带来极致的视觉享受。无论是社区主页、个人中心,还是帖子详情页,每一个细节都经过精心打磨,确保用户在浏览时感受到舒适与愉悦。 2. 模块化架构,灵活扩展 StarFree采用模块化架构设计,开发者可以根据需求自由组合或扩展功能模块。无论是社交互动、内容发布,还是用户管理,每个模块都独立且高效,便于二次开发与定制。这种设计不仅降低了开发难度,还提高了系统的可维护性。 3. 多端适配,无缝体验 StarFree源码支持多端适配,包括Web端、移动端(iOS/Android)以及小程序。无论用户通过哪种设备访问社区,都能获得一致且流畅的体验。源码内置响应式布局
支持TIA_Portal_V20的固件库,可以下载更新最新库。
树木检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]