如何在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、清空原始表中的数据
清空原表:使用 DELETE 或 TRUNCATE 语句清空原表中的数据。例如:
- 使用
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写定时任务判断数据量是否过大,过大则进行分表操作,多张表使用临时视图查询
当数据量过大,在定时任务中执行分表操作 1、复制表结构及数据 在xml中编写复制表结构及数据(newTableName为新表名、originalTableName为原始表名) 只复制表结构: CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTa…...
使用jieba库进行中文分词和去除停用词
jieba.lcut jieba.lcut()和jieba.lcut_for_search()是jieba库中的两个分词函数,它们的功能和参数略有不同。 jieba.lcut()方法接受三个参数:需要分词的字符串,是否使用全模式(默认为False)以及是否使用HMM模型&…...
C语言之分支与循环【附6个练习】
文章目录 前言一、什么是语句?1.1 表达式语句1.2 函数调用语句1.3 控制语句1.4 复合语句1.5 空语句 二、分支语句(选择结构)2.1 if语句2.1.1 悬空else2.1.2 练习(1. 判断一个数是否为奇数 2. 输出1-100之间的奇数) 2.2…...
使用通用MCU实现无人机飞行任务的快速二次开发
使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知,在以往TI电赛真题的学习…...
什么是Selinux
官网地址:What is SELinux? 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 概述 安全增强型 Linux (SELinux) 是Linux 系统的安全架构,允许管理员更好地控制谁可以访问系统。它最初是由美…...
计算机网络知识点
1. URI 和 URL 统一资源定位符(Uniform Resource Locator,缩写:URL),是对资源的引用和访问该资源的方法。俗称网址,就是浏览器地址栏里面的内容。 URL 语法为:protocol://userInfohost:port/p…...
Qt 连接 Mysql
Linux下安装mysql及qt连接_liunx下安装mysql及qt链接-CSDN博客...
HarmonyOS4.0系统性深入开发14AbilityStage组件容器
AbilityStage组件容器 AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。 AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。 DevEco Studio默…...
客服系统接入FastGPT
接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY,同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里,这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…...
Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正
问题描述 使用环境与工具:Unity 2022.3.4fc1,steam VR(2.7.3),steamvrSDK(1.14.15),HTC vive pro专业版,Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明(可参考:HI5 2.0 交…...
广播及代码实现
广播(Broadcast)是一种网络通信方式,它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息,让所有设备都能接收并处理。在广播中,通信的目标是整个网络而不是特定的单个设备。 向子网中…...
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任务一:主机发现与信息收集 *任务说明:仅能获取Server1的IP地址 1.通过渗透机Kali2.0对靶机场景进行TCP同步扫描 (使用Nmap工具),并将该操作使用…...
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 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBr…...
php-fpm运行一段时间,内存不足
目录 一:原因分析 二:解决 三:观察系统情况 php-fpm运行一段时间,内存不足,是什么原因呢。 一:原因分析 1:首先php-fpm的配置 (1)启动的进程数 启动的进程数越多,占用内存越高; 2:其次…...
基于轻量级GhostNet模型开发构建生活场景下生活垃圾图像识别系统
轻量级识别模型在我们前面的博文中已经有过很多实践了,感兴趣的话可以自行移步阅读: 《移动端轻量级模型开发谁更胜一筹,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)参考阿里云扩容分区文档,整理MBR分区扩容 2)本文档适用于MBR分区(fdisk -lu查…...
IPv6地址配置
IPv6地址接口配置 IPv6地址结构 一个IPv6地址可以分为两部分: 网络前缀:n比特,相当于IPv4地址中的网络ID 接口标识:128-n比特,相当于IPv4地址中的主机ID 注意: 对于IPv6单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位,如果地址的前三位是000,则没有此…...
Ubuntu20.04 防火墙配置
ubuntu 系统中配置防火墙 ufw(Uncomplicated Firewall)是一个简化的、易于使用的Linux防火墙工具,旨在方便用户管理iptables防火墙规则。 特点 简化的防火墙管理:ufw提供了一个简洁的命令行界面,让您能够轻松地添加、…...
Windows上ModbusTCP模拟Master与Slave工具的使用
场景 Modbus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用: Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用_modbus poll激活-CSDN博客 数据对接协议为Modbus TCP,本地开发需要使…...
告别盲调:用eBPF uprobe给Go/Python应用函数调用画张“热力图”(附libbpfgo实战代码)
深度剖析eBPF uprobe技术:为Go/Python应用构建动态函数热力图 在云原生与微服务架构盛行的今天,后端服务的性能调优一直是开发者面临的挑战。传统性能分析工具往往需要重启服务或修改代码,这在生产环境中几乎不可行。而eBPF技术的出现&#x…...
Echarts实战:如何用散点图+面积图模拟Power BI丝带图效果(附完整代码)
Echarts实战:用散点图与面积图组合实现Power BI丝带图效果 1. 理解丝带图的核心价值与实现难点 丝带图(Ribbon Chart)作为Power BI的特色可视化组件,其独特之处在于能够直观展示数据在不同时间维度上的变化趋势和相对排名。这种图…...
基于Python+Hadoop+Spark的美食推荐系统 数据采集与可视化平台 Django框架
1、项目介绍 技术栈 Python语言、Django框架、Scrapy爬虫框架、Echarts 可视化,采集下厨房网站数据。功能模块推荐美食美食用料排行榜分析美食分类占比分析饮食科普美食分类美食详情信息美食详情做法后台数据管理项目介绍本项目基于指定技术栈,爬取下厨房…...
Defects4J实战:如何利用这个强大的Java缺陷数据库进行自动化测试
Defects4J深度实战:解锁Java缺陷数据库的自动化测试潜能 在当今快节奏的软件开发环境中,质量保障已成为决定项目成败的关键因素。对于Java开发者而言,Defects4J这个开源的缺陷数据库正逐渐成为提升代码质量的秘密武器。不同于普通的测试框架&…...
如何用3种方法让Fira Code字体提升你的编码效率?
如何用3种方法让Fira Code字体提升你的编码效率? 【免费下载链接】FiraCode Free monospaced font with programming ligatures 项目地址: https://gitcode.com/GitHub_Trending/fi/FiraCode 还在为代码中的箭头符号显示不清晰而烦恼?是否经常需要…...
3步搞定Windows 11优化:用Win11Debloat让你的电脑更快更干净
3步搞定Windows 11优化:用Win11Debloat让你的电脑更快更干净 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简…...
BthPS3驱动技术指南:实现PS3手柄在Windows 11系统的蓝牙适配与优化
BthPS3驱动技术指南:实现PS3手柄在Windows 11系统的蓝牙适配与优化 【免费下载链接】BthPS3 Windows kernel-mode Bluetooth Profile & Filter Drivers for PS3 peripherals 项目地址: https://gitcode.com/gh_mirrors/bt/BthPS3 当你尝试将PS3手柄连接到…...
pdf2htmlEX高级调试技术:汇编级调试与反汇编
pdf2htmlEX高级调试技术:汇编级调试与反汇编 【免费下载链接】pdf2htmlEX Convert PDF to HTML without losing text or format. 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2htmlEX pdf2htmlEX是一款能够将PDF文件转换为HTML格式同时保持文本和格式完…...
SAP-MM:公司间交易(STO)-跨公司销售
一、引言:当销售公司没有库存,怎么办? 假设这样一个场景:你所在的集团有两个法人实体——A 公司负责市场销售,与客户关系紧密,但本身不生产也不持有库存;B 公司是生产基地,拥有所有…...
Llama-3.2V-11B-cot实战案例:金融财报图表理解与关键结论提取
Llama-3.2V-11B-cot实战案例:金融财报图表理解与关键结论提取 1. 项目概述 Llama-3.2V-11B-cot 是一款结合视觉理解和逻辑推理能力的先进模型,特别适合处理需要综合分析图像和文本信息的任务。在金融领域,它能够自动解读财报中的各类图表&a…...
