IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mysql(29) : mybatis分区管理 -> 正文阅读

[大数据]mysql(29) : mybatis分区管理

无分区初始化分区及创建明日分区,定时删除旧分区

注意 : 分区字段必须为主键字段

job


import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author: liyue
 * @Date: 2022/03/02/17:51
 * @Description: mysql分区管理
 */
@Configuration
@Slf4j
public class PartitionManagerJob {


    private ExecutorService executorService = new ThreadPoolExecutor(5, 10,
            3000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(10));
    @Resource
    private CustomizeMapper customizeMapper;

    private static final Map<String, String> tables = new HashMap<String, String>() {{
        put("test1", "create_time");
        put("test2", "create_time");
    }};

    @PostConstruct
    private void init() {
        handle();
    }


    /**
     * 下次执行时间
     * 2022-03-01 10:00:00
     * 2022-03-01 16:00:00
     * 2022-03-01 22:00:00
     * 2022-03-02 10:00:00
     * 2022-03-02 16:00:00
     */
    @Scheduled(cron = "0 0 10,16,22 * * ? ")
    public void task() {
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                handle();
            }
        });
    }

    public void handle() {
        String date = customizeMapper.queryDate();
        String days = customizeMapper.queryDays();

        String tomorrowDate = customizeMapper.queryTomorrowDate();
        String tomorrowDays = customizeMapper.queryTomorrowDays();

        for (Map.Entry<String, String> entry : tables.entrySet()) {
            String table = entry.getKey();
            String timeField = entry.getValue();
            Integer partitionCount = customizeMapper.selectCountPartition(table);
            if (partitionCount > 0) {
                // 已有分区,创建明日分区
                Integer partitionIsExist = customizeMapper.selectPartitionIsExist(table, tomorrowDate);
                if (partitionIsExist == 0) {
                    customizeMapper.createPartition(table, timeField, tomorrowDate, tomorrowDays);
                }
                // 删除旧分区
                List<String> partitions = customizeMapper.selectDaysAgoPartition(table, 3);
                for (String partition : partitions) {
                    customizeMapper.deletePartition(table, partition);
                }
            } else {
                // 无分区,新建今日分区和明日分区
                customizeMapper.initPartition(table, timeField, date, days);
                customizeMapper.createPartition(table, timeField, tomorrowDate, tomorrowDays);
            }
        }
    }
}

mapper


import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * @Author: liyue
 * @Date: 2022/03/02/17:52
 * @Description:
 */
public interface CustomizeMapper {

    @Select("SELECT concat('p',DATE_FORMAT(date_add(now(), interval 1 day),'%Y%m%d'))")
    String queryTomorrowDate();

    @Select("SELECT TO_DAYS(date_add(now(), interval 1 day) )")
    String queryTomorrowDays();

    @Select("SELECT concat('p',DATE_FORMAT(now(),'%Y%m%d'))")
    String queryDate();

    @Select("SELECT TO_DAYS(now())")
    String queryDays();

    @Select("SELECT count(1) FROM INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = schema() AND TABLE_NAME=#{tableName}  and PARTITION_NAME is not null;")
    Integer selectCountPartition(@Param("tableName") String tableName);

    @Select("SELECT count(1) FROM INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = schema() AND TABLE_NAME=#{tableName} AND partition_name = #{partitionName};")
    Integer selectPartitionIsExist(@Param("tableName") String tableName, @Param("partitionName") String partitionName);

    @Select("SELECT partition_name\n" +
            "        FROM   INFORMATION_SCHEMA.PARTITIONS\n" +
            "        WHERE  TABLE_NAME = #{tableName} AND TABLE_SCHEMA = schema() AND partition_description <= to_days(date_sub(curdate(), INTERVAL ${day} DAY))")
    List<String> selectDaysAgoPartition(@Param("tableName") String tableName, @Param("day") Integer day);

    @Update("ALTER TABLE ${tableName} DROP PARTITION ${partitionName};")
    int deletePartition(@Param("tableName") String tableName, @Param("partitionName") String partitionName);

    @Update("ALTER TABLE ${table} partition by range (TO_DAYS(${timeField}))( partition ${partitionName} values less than(${day} ));")
    int initPartition(@Param("table") String table, @Param("timeField") String timeField,
                      @Param("partitionName") String partitionName, @Param("day") String day);

    @Update("ALTER TABLE ${table}  ADD PARTITION ( partition ${partitionName} values less than(${day} ))")
    int createPartition(@Param("table") String table, @Param("timeField") String timeField,
                        @Param("partitionName") String partitionName, @Param("day") String day);

}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:39:43  更:2022-03-04 15:43:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:23:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码