如何在Spring Boot中使用@Scheduled写定时任务判断数据量是否过大,过大则进行分表操作,多张表使用临时视图查询

当数据量过大,在定时任务中执行分表操作

1、复制表结构及数据

在xml中编写复制表结构及数据(newTableName为新表名、originalTableName为原始表名)

只复制表结构:

CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTableName} WHERE 1=0;

复制表结构以及数据:

CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTableName};

在使用 CREATE TABLE … AS SELECT * FROM … 语句时,添加 WHERE 1=0 和不添加的区别在于是否复制原表的数据。

  • 不加 WHERE 1=0:这会将原表中的数据一同复制到新表中。新表将包含原表中所有的行数据。
  • 加上 WHERE 1=0:这样做不会复制任何原表中的数据,只会复制原表的结构(列定义)到新表中,但新表不会包含任何行数据。

因此,如果只复制表的结构而不需要复制数据,可以在 CREATE TABLE … AS SELECT * FROM … 语句后面加上 WHERE 1=0。如果需要同时复制表的结构和数据,就不需要添加这个条件。

2、清空原始表中的数据

清空原表:使用 DELETETRUNCATE 语句清空原表中的数据。例如:

  • 使用 DELETE 语句逐行删除原表中的数据:
DELETE FROM original_table;
  • 使用 TRUNCATE 语句一次性清空原表中的所有数据:
TRUNCATE TABLE original_table;

注意:TRUNCATE 语句会更快地清空表中的数据,但无法回滚操作。

在执行清空原始表中的数据操作之前,请务必备份好原表中的数据,以防止数据丢失或意外删除。

3、示例代码

定时任务类:

package com.yutu.garden.task;import com.yutu.garden.mapper.gardens.SanitationJobStatisticsMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 定时分区、分表*/
@Component
@EnableScheduling
//@ConditionalOnProperty(name = "scheduled.tasks.enabled", havingValue = "true") //application.yml控制所有task任务启动或不启动
public class SplitTrajectoryTableTask {@Resourceprivate SanitationJobStatisticsMapper sanitationJobStatisticsMapper;//	@Scheduled(cron = "0 0 * * * ?") //每小时的整点执行一次任务@Scheduled(cron = "0 0/1 * * * ?") //一分钟执行一次public void checkDataSizeAndSplitTable() {int trajectorySize = sanitationJobStatisticsMapper.getTrajectorySize(); // 获取数据量if (trajectorySize >= 200000) { // 判断数据量是否过大splitTable(); // 执行分表操作}}private void splitTable() {// 获取需要分表的原始表名和新表名前缀(根据实际情况设置)String originalTableName = "card_device_trajectory_info"; //原始表名String newTableNamePrefix = "card_device_trajectory_info_"; //新表 (拼接日期)// 获取当前日期作为分表后缀(或者使用其他规则)SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String tableSuffix = sdf.format(new Date());// 生成新表名String newTableName = newTableNamePrefix + tableSuffix;// 创建新的分表 并 将原始表中符合条件的数据迁移到新表(根据实际情况设置条件)sanitationJobStatisticsMapper.copyTable(originalTableName,newTableName);// 更新原始表 (将原始表中的数据清空)注意:测试前先备份好原始数据,以防丢失sanitationJobStatisticsMapper.truncateTable(originalTableName);}
}

Mapper方法:

	int getTrajectorySize();boolean copyTable(@Param("originalTableName") String originalTableName,@Param("newTableName") String newTableName);boolean truncateTable(@Param("originalTableName") String originalTableName);

Sql语句:

    <select id="getTrajectorySize" resultType="int">select count(*) from card_device_trajectory_info</select><update id="copyTable"><![CDATA[CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTableName};]]></update><delete id="truncateTable">TRUNCATE TABLE ${originalTableName};</delete>

在 Mybatis 的 XML 中,使用 <![CDATA[ ]]> 包裹 SQL 语句是为了防止 XML 解析器将其中的特殊字符(如 <, >)解析成 XML 标签,从而导致语法错误。因此,加上<![CDATA[ ]]> 是一种良好的实践,可以确保 SQL 语句被正确解析。

但是,在某些情况下,如果 SQL 语句中不包含需要转义的特殊字符,也可以省略 <![CDATA[ ]]>。例如,如果 SQL 语句只包含简单的 SELECT 语句,没有特殊字符,那么可以直接写在 <update> 标签内,而无需使用 <![CDATA[ ]]> 包裹。
以下是不使用 <![CDATA[ ]]> 包裹 SQL 语句的示例:

<update id="copyTable">CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTableName};
</update>

如果 SQL 语句中包含特殊字符或需要转义的内容,建议仍然使用 <![CDATA[ ]]> 对 SQL 进行包裹

4、多表创建临时视图查询

创建临时视图 card_device_trajectory_info_view

CREATE TEMPORARY VIEW card_device_trajectory_info_view AS
SELECT *
FROM card_device_trajectory_info  --表1
UNION ALL
SELECT * FROM card_device_trajectory_info_bf; --表2

执行业务查询

 select * from card_device_trajectory_info_view where imei = '15127423721' and DATE(gps_time) = CURRENT_DATE order by gps_time asc

手动删除视图资源 (如果不手动删除也会自动删除,所以这一步可以省略)

 DROP VIEW card_device_trajectory_info_view;

临时视图普通视图(永久视图)之间有以下区别:

  • 生命周期:临时视图只在当前会话有效,会话结束后会自动删除。而普通视图是永久性的,会一直存在数据库中,除非显式删除。
  • 可见性:临时视图只对创建它的会话可见,其他会话无法访问。而普通视图对所有会话都可见,可以被多个会话共享和使用。
  • 存储方式:临时视图的数据可以存储在内存或者临时表中,查询速度较快。而普通视图的数据存储在磁盘上,查询速度可能相对较慢。
  • 持久性:临时视图是临时创建的,不会被数据库系统持久化存储。而普通视图是一个已经定义好的查询,可以被保存并在需要时重新使用。
  • 数据更新:临时视图一般用于查询数据,不能进行数据更新操作。而普通视图可以根据定义的规则进行数据更新,例如使用触发器或者规定的权限。
  • 使用场景:临时视图通常用于会话级别的临时计算或者中间结果的存储。普通视图用于复杂查询、数据重用和提供简化的数据模型。
CREATE TEMPORARY VIEW table_view --创建临时视图(会话结束会自动删除)
CREATE VIEW table_view --创建普通视图(会话结束不会自动删除,需要手动 DROP VIEW table_view 进行删除)

总的来说,临时视图适用于需要在会话中临时存储和处理数据的场景,而普通视图适用于长期的数据查询和数据模型定义。选择使用哪种类型取决于业务需求和数据处理的特点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目规划常用的ChatGPT通用提示词模板

项目目标明确&#xff1a;如何明确项目的目标&#xff0c;确保项目方向的一致性&#xff1f; 项目范围界定&#xff1a;如何界定项目的范围&#xff0c;确保项目内容的明确性&#xff1f; 项目需求分析&#xff1a;如何对项目需求进行深入分析&#xff0c;确保满足客户的期望…

关于征集参与《工程售后服务评价技术要求》团体标准起草单位的通知

根据 2023年团体标准管理制修订计划安排&#xff0c;为使标准更具专业性、实用 性和可操作性&#xff0c;吸纳行业内有代表性的骨干企业和专家作为起草单位和起草人 &#xff0c;现就我单位牵头申报的《工程售后服务评价技术要求》团体标准公开征集起草单位和起草人。 一、 申…

常见的软件架构风格

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 以下是最常见的建筑风格&#xff1a; 整体式&#xff1a;将整个应用程序构建为一个单元&#xff0c;其中所有功能和组件都从一个位置进行管理和服务。整体架构的例…

Vite5 + Vue3 + Element Plus 前端框架搭建

为了开发一套高效使用的 Vite5 + Vue3 + Element Plus 前端框架,你可以按照以下步骤进行。话不多说,先上演示地址:Vue Shop Vite。 1, 安装开发环境 开发之前,确保你的电脑已经安装了 Node.js(建议使用最新稳定版 LTS),然后安装 Vite CLI。在命令行中运行以下命令: …

信息学奥赛一本通2065:【例2.2】整数的和

2065&#xff1a;【例2.2】整数的和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 83717 通过数: 70665 【题目描述】 求3个整数的和。 输入a、b、c这3个整数&#xff0c;求它们的和。 【输入】 3个整数。 【输出】 三个数的和。 【输入样例】 1 2 3 【输出样…

使用“反向代理服务器”的优点是什么?

反向代理服务器是一种网络架构模式&#xff0c;通常位于客户端和实际服务器之间&#xff0c;用于处理客户端请求并转发到实际服务器。以下是使用反向代理服务器的优点&#xff1a; 1.安全性&#xff1a;反向代理服务器可以提供额外的安全层。通过在反向代理服务器上配置防火墙和…

Prometheus-blackbox

一. 部署 apiVersion: v1 kind: ConfigMap metadata:name: blackbox-confignamespace: monitor data:blackbox.yml: |-modules:http_2xx: # http 检测模块 Blockbox-Exporter 中所有的探针均是以 Module 的信息进行配置prober: httptimeout: 10shttp:valid_http_versions: […

js实现 copy字符串 复制到剪切板

js实现 copy字符串 复制到剪切板 定义方法 function copyStr(str) {var oInput document.createElement(input);oInput.value str;document.body.appendChild(oInput);oInput.select(); // 选择对象document.execCommand(Copy); // 执行浏览器复制命令oInput.className oIn…

Android中的Intent

一.显式Intent 显示Intent是明确目标Activity的类名 1. 通过Intent(Context packageContext, Class<?> cls)构造方法 2.通过Intent的setComponent()方法 3.通过Intent的setClass/setClassName方法 通过Intent(Context packageContext, Class<?> cls)构造方法 通…

羊大师解读,羊奶的口味更适合哪些人群?

羊大师解读&#xff0c;羊奶的口味更适合哪些人群&#xff1f; 羊奶作为一种营养丰富的乳制品&#xff0c;拥有许多独特的品质和口味&#xff0c;备受消费者的青睐。它不仅含有丰富的蛋白质、维生素和矿物质&#xff0c;还具有更易消化的特点&#xff0c;适合许多人群的饮用。…

【KingbaseES】实现MySql函数WEEKS_BETWEEN

WEEKS_BETWEEN CREATE OR REPLACE FUNCTION weeks_between(start_date date, end_date date) RETURNS integer AS $$ BEGIN RETURN EXTRACT(WEEK FROM end_date) - EXTRACT(WEEK FROM start_date); END; $$ LANGUAGE plpgsql IMMUTABLE;结果展示

【C语言】stdbool.h——有关bool的总结

在编程和日常生活中&#xff0c;经常需要一种只能具有两个值之一的数据类型&#xff0c;如是否、开关、真假等&#xff0c;因此&#xff0c;C 有一种bool数据类型&#xff0c;称为booleans。布尔值表示 或true的值false。 C 中的 bool 是大多数语言中的基本数据类型&#xff0…

图片上传下载

数据模型: imageUrl: , <el-form-item label"楼盘图片:" prop"pic" class"uploadImg" v-model"emp.pic"> <el-upload class"avatar-uploader" …

自制java工具实现 ctrl+c+c 翻译鼠标选中文本

前言 本功能的实现基于这篇笔记 http://t.csdnimg.cn/1I8ln&#xff0c;本文阅读过程中有疑惑都可以查看此笔记 实现思路&#xff1a;检测到按压ctrl c c 后&#xff0c;获取当前剪切板文字&#xff0c;调用百度翻译api。 实现结果&#xff1a; 完整代码在最后 实现过程 1 监控…

关于鸿蒙的笔记整理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、关于样式1 . 默认单位 vp2 . 写公共样式 二 、 加载图片三 、 父子组件传值四 、 自定义构建函数 Builder五、构建函数-BuilderParam 传递UI 一、关于样式 1 .…

Java中请求生成唯一追溯TraceId

Java中请求生成唯一追溯TraceId 一&#xff1a;背景 因为是微服务架构,平常日志太多,看日志不太好查,所以想要从一整个链路当中获取一个唯一标识,比较好定位问题&#xff0c; 原理就是从gateway网关将标识传递到下游,下游服务拿到这个标识,响应结束后将traceId反向写入响应体…

[论文笔记] Megtron_LM 0、报错:vscode调试无法传进去参数 launch.json文件获取args参数

解决方法&#xff1a; 配置好launch.json文件后&#xff0c;应该点运行和调试里面的运行按钮。而不是直接点文件右上角的debug。 可以看到terminal中&#xff0c;如果没有正常加载launch.json&#xff0c;则参数中没有args的参数。 如果正常加载&#xff0c;可以看到args的很多…

匿名内部类为什么泄漏,Lambda为什么不泄漏(案例不涉及持外部引用的情况,即:只分析匿名内部类和Lambda内部类情况)

theme: channing-cyan 在Android开发中&#xff0c;内存泄露发生的场景其实主要就两点&#xff0c;一是数据过大的问题&#xff0c;而是调用与被调用生命周期不一致问题&#xff0c;对于对象生命周期不一致导致的泄漏问题占90%&#xff0c;最常见的也不好分析的当属匿名内部类…

Java中的IO与NIO篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、NIO 的非阻塞二、Channel三、Buffer四、Selector前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、NIO 的非阻塞 I…

Java:HeapMemory和DirectMemory配置与使用介绍

目录 一、Heap内存 1、查看Heap内存配置的最大值 2、配置Heap内存最大值的方式 3、配置Heap内存最小值的方式 4、查看已使用Heap内存的方式 5、查看未使用Heap内存的方式 二、Direct内存 1、查看Direct内存配置的最大值 2、配置Direct内存最大值的方式 3、获取Direct…