欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

該輔助類主要作用有:

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

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

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

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

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

在本文中不做詳細解釋。

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

將請求參數(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();

        //動態(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表就是要拆分的表,如果有多個,在if里面寫多個。

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

總結(jié)

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

相關(guān)文章

  • MySQL索引是啥?不懂就問

    MySQL索引是啥?不懂就問

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

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

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

    JMeter壓測Mysql教程分享

    文章介紹了如何使用JMeter進行數(shù)據(jù)庫壓力測試的步驟,包括安裝JMeter、下載并配置MySQL JDBC驅(qū)動、設(shè)置測試計劃、添加JDBC連接配置元件、添加JDBC請求取樣器以及可選的監(jiān)聽器配置,最后,文章指導(dǎo)如何運行測試并分析結(jié)果,以評估數(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語句時,會發(fā)現(xiàn)這個問題,一般就是連接mysql數(shù)據(jù)庫不穩(wěn)定
    2008-06-06
  • MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯誤的解決辦法

    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...錯誤的解決辦法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • MySQL筆記之視圖的使用詳解

    MySQL筆記之視圖的使用詳解

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

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

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

    mysql獲得60天前unix時間思路及代碼

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

    MySQL中幾種插入和批量語句實例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中幾種插入和批量語句的相關(guān)資料,在mysql數(shù)據(jù)庫中,實現(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é),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論