亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MybatisPlus攔截器如何實(shí)現(xiàn)數(shù)據(jù)表分表

 更新時(shí)間:2024年11月06日 09:29:12   作者:樘棣寂寂  
為了解決MySQL中大數(shù)據(jù)量的查詢效率問題,采用水平拆分策略,通過取模運(yùn)算確定表后綴,實(shí)現(xiàn)數(shù)據(jù)的有效管理,設(shè)計(jì)分表時(shí),需利用線程變量存取請(qǐng)求參數(shù),并通過攔截器確定操作的具體表名,從而優(yōu)化數(shù)據(jù)處理性能,此方法適用于業(yè)務(wù)表數(shù)據(jù)量大或快速增長的場(chǎng)景

MybatisPlus攔截器實(shí)現(xiàn)數(shù)據(jù)表分表

很多項(xiàng)目都會(huì)存在一些數(shù)據(jù)量很大或者數(shù)據(jù)量增加很快的業(yè)務(wù)表,由于mysql的數(shù)據(jù)量達(dá)到一定量后會(huì)影響我們的查詢效率,為了避免該類問題發(fā)生,我們需要在項(xiàng)目前期設(shè)計(jì)的時(shí)候針對(duì)這兩類情況做一個(gè)分表的設(shè)計(jì)。

這里的分表指的是水平拆分(只是表名不同,其余字段都一致,主鍵id不允許重復(fù)),對(duì)某一個(gè)數(shù)字取模運(yùn)算做為拆分后表的后綴名,具體要分多少張表可通過自己實(shí)際的項(xiàng)目情況確定。

首先創(chuàng)建請(qǐng)求參數(shù)傳遞的一個(gè)輔助類

/**
 * 請(qǐng)求參數(shù)傳遞輔助類
 */
public class RequestDataHelper {
    /**
     * 請(qǐng)求參數(shù)存取
     */
    private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>();

    /**
     * 設(shè)置請(qǐng)求參數(shù)
     *
     * @param requestData 請(qǐng)求參數(shù) MAP 對(duì)象
     */
    public static void setRequestData (Map<String, Object> requestData) {
        REQUEST_DATA.set(requestData);
    }

    /**
     * 獲取請(qǐng)求參數(shù)
     *
     * @return 請(qǐng)求參數(shù) MAP 對(duì)象
     */
    public static Map<String, Object> getRequestData () {
        return REQUEST_DATA.get();
    }
}

該輔助類主要作用有:

  • a.設(shè)置請(qǐng)求參數(shù)
  • b.將請(qǐng)求參數(shù)存取到線程變量中
  • c.獲取請(qǐng)求參數(shù)

簡單的說就是在涉及到需要分表的數(shù)據(jù)操作時(shí),將請(qǐng)求參數(shù)放入線程變量中。

然后在攔截器里面獲取這個(gè)參數(shù),做特定的處理,找到我們具體要操作的那張表。

這里的請(qǐng)求參數(shù)大家可以把它理解成跟我們分表后的表名產(chǎn)生關(guān)聯(lián)的數(shù)據(jù)。

這里面的線程變量是僅在當(dāng)前線程下可使用的數(shù)據(jù),與其他線程做隔離。

在本文中不做詳細(xì)解釋。

在涉及到分表的數(shù)據(jù)層操作前(Mybatisplus或者M(jìn)ybatis增刪改查數(shù)據(jù)前)

將請(qǐng)求參數(shù)放入線程變量

RequestDataHelper.setRequestData(Collections.singletonMap("studentId", param.getStudentId()));
        LambdaQueryWrapper<StudentRecordEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StudentRecordEntity::getStudentId, param.getStudentId());
        List<StudentRecordEntity> studentRecordEntityList = super.list(queryWrapper);

Mybatisplus 攔截器代碼

/**
     * Mybatis plus 攔截器
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        //動(dòng)態(tài)表插件
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
            // 獲取參數(shù)方法
            if (tableName.equalsIgnoreCase("t_student_record")) {
                Map<String, Object> paramMap = RequestDataHelper.getRequestData();
                long studentId= Long.parseLong(String.valueOf(paramMap.get("studentId")));
                int mod = (int) (studentId% 16);
                return tableName + "_" + mod;

            } else {
                return tableName;
            }
        });
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }

這里面t_student_record表就是要拆分的表,如果有多個(gè),在if里面寫多個(gè)。

studentId就是調(diào)用的時(shí)候傳入線程變量的請(qǐng)求參數(shù),對(duì)它%16就是分了16張表,根據(jù)實(shí)際業(yè)務(wù)情況,需要分多少張就把%后面的數(shù)字改為多少。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL索引是啥?不懂就問

    MySQL索引是啥?不懂就問

    索引是幫助數(shù)據(jù)庫高效獲取數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),是基于數(shù)據(jù)表創(chuàng)建的,它包含了一個(gè)表中某些列的值以及記錄對(duì)應(yīng)的地址,并且把這些值存在一個(gè)數(shù)據(jù)結(jié)構(gòu)中,常見的有使用哈希表、B+樹作為索引
    2021-07-07
  • Windows下MySQL8.0.18安裝教程(圖解)

    Windows下MySQL8.0.18安裝教程(圖解)

    這篇文章主要介紹了Windows下MySQL8.0.18安裝教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • JMeter壓測(cè)Mysql教程分享

    JMeter壓測(cè)Mysql教程分享

    文章介紹了如何使用JMeter進(jìn)行數(shù)據(jù)庫壓力測(cè)試的步驟,包括安裝JMeter、下載并配置MySQL JDBC驅(qū)動(dòng)、設(shè)置測(cè)試計(jì)劃、添加JDBC連接配置元件、添加JDBC請(qǐng)求取樣器以及可選的監(jiān)聽器配置,最后,文章指導(dǎo)如何運(yùn)行測(cè)試并分析結(jié)果,以評(píng)估數(shù)據(jù)庫在不同壓力下的性能表現(xiàn)
    2024-11-11
  • Lost connection to MySQL server during query的解決

    Lost connection to MySQL server during query的解決

    經(jīng)常在執(zhí)行sql語句時(shí),會(huì)發(fā)現(xiàn)這個(gè)問題,一般就是連接mysql數(shù)據(jù)庫不穩(wěn)定
    2008-06-06
  • MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯(cuò)誤的解決辦法

    MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has

    這篇文章主要給大家介紹了MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯(cuò)誤的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • MySQL筆記之視圖的使用詳解

    MySQL筆記之視圖的使用詳解

    使用視圖的大部分情況是為了保障數(shù)據(jù)安全性,提高查詢效率
    2013-05-05
  • MySQL?搭建主從同步實(shí)現(xiàn)操作

    MySQL?搭建主從同步實(shí)現(xiàn)操作

    這篇文章主要介紹了MySQL?中的主從同步實(shí)現(xiàn)操作,文章圍繞如何搭建主從同步詳細(xì)展開內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03
  • mysql獲得60天前unix時(shí)間思路及代碼

    mysql獲得60天前unix時(shí)間思路及代碼

    首先根據(jù)now()獲得當(dāng)前時(shí)間,使用adddate()方法獲得60天前時(shí)間,使用unix_timestamp()方法轉(zhuǎn)換時(shí)間類型
    2014-08-08
  • MySQL中幾種插入和批量語句實(shí)例詳解

    MySQL中幾種插入和批量語句實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中幾種插入和批量語句的相關(guān)資料,在mysql數(shù)據(jù)庫中,實(shí)現(xiàn)批量插入數(shù)據(jù)與批量更新數(shù)據(jù)的例子,即批量insert、update的方法,需要的朋友可以參考下
    2021-09-09
  • MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié)

    MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié)

    這篇文章主要介紹了MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論