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

如何在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 进行删除)

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

相关文章:

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

当数据量过大&#xff0c;在定时任务中执行分表操作 1、复制表结构及数据 在xml中编写复制表结构及数据&#xff08;newTableName为新表名、originalTableName为原始表名&#xff09; 只复制表结构&#xff1a; CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTa…...

使用jieba库进行中文分词和去除停用词

jieba.lcut jieba.lcut()和jieba.lcut_for_search()是jieba库中的两个分词函数&#xff0c;它们的功能和参数略有不同。 jieba.lcut()方法接受三个参数&#xff1a;需要分词的字符串&#xff0c;是否使用全模式&#xff08;默认为False&#xff09;以及是否使用HMM模型&…...

C语言之分支与循环【附6个练习】

文章目录 前言一、什么是语句&#xff1f;1.1 表达式语句1.2 函数调用语句1.3 控制语句1.4 复合语句1.5 空语句 二、分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 练习&#xff08;1. 判断一个数是否为奇数 2. 输出1-100之间的奇数&#xff09; 2.2…...

使用通用MCU实现无人机飞行任务的快速二次开发

使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知&#xff0c;在以往TI电赛真题的学习…...

什么是Selinux

官网地址&#xff1a;What is SELinux? 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 概述 安全增强型 Linux (SELinux) 是Linux 系统的安全架构&#xff0c;允许管理员更好地控制谁可以访问系统。它最初是由美…...

计算机网络知识点

1. URI 和 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff09;&#xff0c;是对资源的引用和访问该资源的方法。俗称网址&#xff0c;就是浏览器地址栏里面的内容。 URL 语法为&#xff1a;protocol://userInfohost:port/p…...

Qt 连接 Mysql

Linux下安装mysql及qt连接_liunx下安装mysql及qt链接-CSDN博客...

HarmonyOS4.0系统性深入开发14AbilityStage组件容器

AbilityStage组件容器 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默…...

客服系统接入FastGPT

接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY&#xff0c;同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里&#xff0c;这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…...

Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正

问题描述 使用环境与工具&#xff1a;Unity 2022.3.4fc1&#xff0c;steam VR(2.7.3)&#xff0c;steamvrSDK&#xff08;1.14.15&#xff09;&#xff0c;HTC vive pro专业版&#xff0c;Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明&#xff08;可参考&#xff1a;HI5 2.0 交…...

广播及代码实现

广播&#xff08;Broadcast&#xff09;是一种网络通信方式&#xff0c;它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息&#xff0c;让所有设备都能接收并处理。在广播中&#xff0c;通信的目标是整个网络而不是特定的单个设备。 向子网中…...

QT应用篇 三、QML自定义显示SpinBox的加减按键图片及显示值效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.SpinBox组件2.SpinBox中QML的使用 总结 前言 记录自己学习QML的一些小技巧方便日后查找 QT的…...

2022年全国职业院校技能大赛网络安全竞赛试题1-10-B模块总结

前言 结尾有对22年国赛题型总结 试题1模块B 网络安全事件响应、数字取证调查和应用安全 B-1任务一&#xff1a;主机发现与信息收集 *任务说明&#xff1a;仅能获取Server1的IP地址 1.通过渗透机Kali2.0对靶机场景进行TCP同步扫描 (使用Nmap工具)&#xff0c;并将该操作使用…...

20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850

20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850 2023/12/28 12:30 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBr…...

php-fpm运行一段时间,内存不足

目录 一&#xff1a;原因分析 二&#xff1a;解决 三:观察系统情况 php-fpm运行一段时间&#xff0c;内存不足&#xff0c;是什么原因呢。 一&#xff1a;原因分析 1:首先php-fpm的配置 &#xff08;1&#xff09;启动的进程数 启动的进程数越多,占用内存越高; 2:其次…...

基于轻量级GhostNet模型开发构建生活场景下生活垃圾图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…...

《Linux系列》Linux磁盘MBR分区扩容

文章目录 Linux磁盘MBR分区扩容1.前言2.控制台磁盘扩容3.分区扩容3.1 fdisk3.2 lsblk3.3 扩容分区 4.扩容文件系统4.1 df4.2 扩容文件系统 Linux磁盘MBR分区扩容 1&#xff09;参考阿里云扩容分区文档&#xff0c;整理MBR分区扩容 2&#xff09;本文档适用于MBR分区(fdisk -lu查…...

IPv6地址配置

IPv6地址接口配置 IPv6地址结构 一个IPv6地址可以分为两部分: 网络前缀:n比特,相当于IPv4地址中的网络ID 接口标识:128-n比特,相当于IPv4地址中的主机ID 注意: 对于IPv6单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位,如果地址的前三位是000,则没有此…...

Ubuntu20.04 防火墙配置

ubuntu 系统中配置防火墙 ufw&#xff08;Uncomplicated Firewall&#xff09;是一个简化的、易于使用的Linux防火墙工具&#xff0c;旨在方便用户管理iptables防火墙规则。 特点 简化的防火墙管理&#xff1a;ufw提供了一个简洁的命令行界面&#xff0c;让您能够轻松地添加、…...

Windows上ModbusTCP模拟Master与Slave工具的使用

场景 Modbus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用&#xff1a; Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用_modbus poll激活-CSDN博客 数据对接协议为Modbus TCP,本地开发需要使…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...