当前位置: 首页 > news >正文

Mybatis-Plus实现MySQL分表

Mybatis-Plus 是什么?

MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。简单理解就是增强版的 MyBatis。Mybatis-Plus 优点这里不赘述,不是我们的重点。

MySQL 为啥需要分表?

随着数据量增多,MySQL 会出现如下两种情况:

  • B+ 树高度增加,访问磁盘 IO 次数增多,B+ 数索引性能下降;

  • 热数据超过 Buffer Pool 缓冲池大小,导致缓存命中率降低。

Mybatis-Plus 如何实现分表?

MyBatis-Plus 没有直接分表功能,可以通过其插件机制和动态表名功能实现分表。

DynamicTableNameHandler 实现动态表名方法

import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import org.apache.commons.lang3.StringUtils;import java.util.Locale;/*** 动态表处理器**/
public class DynamicTableNameHandler implements TableNameHandler {private static final ThreadLocal<String> suffixThreadLocal = new ThreadLocal<>();/*** 设置表名后缀*/public static void set(String suffix) {suffixThreadLocal.set(suffix);}/*** 删除表名后缀**/public static void remove() {suffixThreadLocal.remove();}@Overridepublic String dynamicTableName(String sql, String tableName) {if (StringUtils.isNotEmpty(suffixThreadLocal .get())) {return String.format(Locale.ROOT, "%s_%s", tableName, suffixThreadLocal.get());}return tableName;}
}

将 DynamicTableNameHandler 添加到 Mybatis Plus 拦截器处理链上

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.hihonor.kidswatch.db.DynamicTableNameHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** MyBatisPlus配置*/
@Configuration
public class MyBatisPlusConfig {/*** 拦截器配置*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();dynamicTableNameInnerInterceptor.setTableNameHandler(new DynamicTableNameHandler());interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);return interceptor;}
}

假设将用户分成10个表,则表名后缀为 userId %10,使用如下:

/*** 执行查询逻辑*/
private void execute(Long userId) {try {DynamicTableNameHandler.set(genSuffix(userId));// 正常sql逻辑DynamicTableNameHandler.remove();} catch (Exception e) {log.error("dynamic table name error", e);} finally {DynamicTableNameHandler.remove();}}/*** 获取表名后缀*/
private String genSuffix(Long userId) {long cnt = userId % 10;return Long.toString(cnt);
}

在 finally 里面添加线程变量删除逻辑,是担心在执行 SQL 逻辑的时候,如果出现异常,线程变量没有删除将出现内存溢出的问题。

动态表名处理器是 Mybatis-Plus 提供的轻量级分表解决方案,重量级的可以考虑 ShardingSphere 等专业框架。

http://www.dtcms.com/a/552832.html

相关文章:

  • 兵团住房和城乡建设局网站网站设计标杆企业
  • 快充新标杆:AVS 协议如何重塑手机充电体验
  • LIUNX 与手机安卓的文件互传 的常用方法
  • 第一届数证杯做题笔记(流量分析和手机取证)
  • 【IO多路转接】深入解析 poll:从接口到服务器实现
  • 【Spring Boot】Spring Boot解决循环依赖
  • 网站开发发展趋势2018网上建立网站赚钱
  • SuperMap Hi-Fi 3D SDK for Unreal 使用蓝图接口加载多源数据
  • 【Java】如何使用jdbc连接并操作MySQL,一文读
  • SSM宠物寄养系统ih041gj7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 网站广告素材php网站免费模板
  • 还在用JDK8?JDK8升级JDK11:一次价值千万的升级指南
  • 深圳网站建设模板乐云seo与设计行业相关的网站
  • 缓存异常:缓存穿透、缓存击穿、缓存雪崩
  • 【计算机网络】IO复用方法(二)——Select
  • 【Java EE进阶 --- SpringBoot】统一功能处理(拦截器)
  • 主流数据分析工具全景对比:Excel / Python / R / Power BI / Tableau / Qlik / Snowflake
  • 从被动防御到主动管控:雷池SafeLine的远程安全运营之道
  • 人体静电消除器安全设计 蒙冬智能
  • 我想要个网站深圳最新招聘
  • Hybrid OCR-LLM框架用于在大量复杂密集企业级文档信息提取
  • 仙居做网站在哪里做项目网格化管理方案
  • ubuntu部署whisper+speaker_large+qwen【一】
  • 四大主流平台深度测评:2025企业自动化运维平台选型指南,自动化巡检平台适配关键场景
  • 计算机毕业设计 基于Python的热门游戏推荐系统的设计与实现 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 每周读书与学习->JMeter主要元件详细介绍(三)逻辑控制器
  • QML学习笔记(四十八)QML与C++交互:QML中可实例化C++对象
  • 深信服上网行为 SANGFOR_AC_v11.0_AD域密码认证配置
  • RKNN-Toolkit2入门
  • 服务器公网IP、私网IP、弹性IP是什么?区别与应