记一次批量更新mysql数据过程

news2024/11/19 19:38:17

一、前言

需求背景:mysql数据库中有一个表的数据(600多万)有一个字段的内容需要解密再通过另外一种加密方式进行加密再回存。通过java程序计算完成更新。

二、方案一

一条条计算更新。这里是将手机号解密,在通过另外一种方式回存。

算法步骤:

1、查询需要解密的数据总条数

2、循环查询1条数据,进行解密,加密,更新,commit。

	public void updateOne() {

		int n = 0;
		n = getCount();
		log.info("待密数据条数:" + n);

		if (n > 0) {
			for (int i = 0; i < n; i++) {
				TmpMUser tmpMUser = getOne();
				if (null != tmpMUser) {
					String yphone = tmpMUser.getCellphoneSha();
					log.info("原手机号:" + yphone);
					if (!StringUtils.isEmpty(yphone)) {
						yphone = yphone.replaceFirst("86-s4:", "");
						String phone = SM4Util.sm4Decode(yphone, keyString);
						String origPhone = SHAUtils.getSHA("86-" + phone);
						log.info("解密出手机号:" + phone);
						tmpMUser.setPhone(phone);
						tmpMUserMapper.updateTmpMUser(tmpMUser.getRowId(), phone, origPhone);
						tmpMUserMapper.commit();
					}

				}

				log.info("已解密数据条数:" + i);

			}

		} else {

			log.info("没有需要解密的数据");
		}

	}

存在的问题。

数据量太大,几秒钟才能操作完成一条。原因:每更新一条就commit,消耗数据库性能,第二,更新的条件没有索引,查找数据较慢。

三、方案二

改进,建索引,每200条commit一次。

/**
	 * 更新200条
	 * 
	 */
	public void update200() {

		int n = 0;
		n = getCount();
		log.info("待密数据条数:" + n);

		if (n > 0) {
			for (int i = 0; i < n / 200 + 200; i++) {
				List<TmpMUser> tmpMUserList = get200();
				if (CollectionUtils.isNotEmpty(tmpMUserList)) {

					for (TmpMUser tmpMUser : tmpMUserList) {
						String yphone = tmpMUser.getCellphoneSha();
						log.info("原手机号:" + yphone);
						if (!StringUtils.isEmpty(yphone)) {
							yphone = yphone.replaceFirst("86-s4:", "");
							String phone = SM4Util.sm4Decode(yphone, keyString);
							String origPhone = SHAUtils.getSHA("86-" + phone);
							log.info("解密出手机号:" + phone);
							tmpMUser.setPhone(phone);
							tmpMUserMapper.updateTmpMUser(tmpMUser.getRowId(), phone, origPhone);
						}

					}
					tmpMUserMapper.commit();

				}

				log.info("已解密数据条数:" + 2 * i + "00");

			}

		} else {

			log.info("没有需要解密的数据");
		}

	}

四、主要问题

这里更新数据一定需要手动commit,如果没有commit更新是不生效的,所以优化这一步是关键。

优化完成,提升到每秒200条。

   /**
     * 提交事务
     */
    @Update("<script>" +
            "commit " +
            "</script>")
    public void commit();

 

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

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

相关文章

港联证券:哪里可以买卖股票?

股票作为一种出资品&#xff0c;已经成为了出资者不可忽视的重要东西。然而&#xff0c;关于新手出资者来说&#xff0c;他们往往不知道哪里能够生意股票。本文将从多个视点剖析&#xff0c;介绍股票市场的基本知识、股票生意的方法以及购买股票需求留意的事项。 一、股票市场的…

(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录 1、备忘录模式&#xff08;Memento Pattern&#xff09;含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现备忘录模式的实例 1、备忘录模式&#…

实战教程:如何自己搭建一个小程序商城?

如今&#xff0c;随着移动互联网的发展&#xff0c;电子商务已经成为人们购物的主要方式之一。而商城小程序的出现&#xff0c;更是方便了商家进行线上销售和推广。本文将为大家详细介绍如何搭建一个商城小程序&#xff0c;让你从小白变为专家。 首先&#xff0c;我们需要登录乔…

Linux内核源码分析 (3)调度器的实现

Linux内核源码分析 (3)调度器的实现 文章目录 Linux内核源码分析 (3)调度器的实现一、概述二、调度器数据结构1、task_struct中与调度有关的的成员2、调度器类3、就绪队列4、调度实体 三、处理优先级1、优先级的内核表示2、计算优先级3、计算负荷权重 四、核心调度器1、周期性调…

工作的记录

request.getServletPath()&#xff0c;request.getContextPath()的区别 request.getSession().getServletContext().getRealPath("/"); request.getServletPath()&#xff0c;request.getContextPath()的区别_中森明菜的博客-CSDN博客 spring中 getBeansOfType 灵…

可拖动表格

支持行拖动&#xff0c;列拖动 插件&#xff1a;sortablejs UI: elementUI <template><div><hr style"margin: 30px 0;"><div><!-- 数据里面要有主键id&#xff0c; 否则拖拽异常 --><h2 style"margin-bottom: 30px&qu…

【大山里的女孩】

我生来就是高山而非溪流&#xff0c;我欲于群峰之巅仰视平庸的沟壑。 这是她们的呐喊&#xff01; “我不知道我还有多少时间&#xff0c;现在还能动&#xff0c;我想做点事。” 这是张桂梅平凡的宣言&#xff0c;也是她一生都在践行的梦想。 17岁的她&#xff0c;为了祖国建…

Python-matplotlib画图时标题中的指数表示

1.示例 2.核心代码 # 修改横轴的刻度 # 生成刻度的位置和标签 total_steps 1000000 # 总共100万步 num_segments 10 # 分成10段 segment_length total_steps // num_segments # 每段的步数# 生成刻度的位置 custom_ticks np.arange(0, total_steps 1, segment_length…

基于孪生神经网络Siamese开发构建牛脸识别分析系统

关于牛脸识别相关的项目开发实践&#xff0c;在我前面的一篇文章中已经有非常详细的实践记录了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《助力养殖行业数字化转型&#xff0c;基于深度学习模型开发构建牛脸识别系统》 在我们以往接触到的项目或者是业务场景中…

L1-044 稳赢(Python实现) 测试点全过

题目 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方输得太惨&#xff0c;你需要每隔K次就…

小红书运营 变现方法总结

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家分享一下小红书如何变现的方法。介绍四个赛道和玩法给大家参考。 想在小红书成为博主的同学们要牢记一句话&#xff1a;赛道的选择比流量更重要。方向错误&#xff0c;再怎么努力也是徒劳。小红书是近几年最值得投资的平台…

JUC并发编程--------基础篇

一、多线程的相关知识 栈与栈帧 我们都知道 JVM 中由堆、栈、方法区所组成&#xff0c;其中栈内存是给谁用的呢&#xff1f;其实就是线程&#xff0c;每个线程启动后&#xff0c;虚拟 机就会为其分配一块栈内存。 每个栈由多个栈帧&#xff08;Frame&#xff09;组成&#xf…

Linux 常用命令 2

Linux 常用命令 2 1、组和权限管理1.1、ls 指令1.2、chown 指令1.3、chgrp 指令1.4、chmod 指令1.5、chown 指令1.6、chgrp 指令 2、crond 任务调度2.1、crontab2.2、时间格式2.3、脚本无法执行问题2.4、案例 3、进程管理3.1、ps 指令3.2、kill 和 killall 指令3.3、pstree 指令…

《开发实战》12 | 异常处理:别让自己在出问题的时候变为瞎子

12 | 异常处理&#xff1a;别让自己在出问题的时候变为瞎子 捕获和处理异常容易犯的错 “统一异常处理”方式正是我要说的第一个错&#xff1a;不在业务代码层面考虑异常处理&#xff0c;仅在框架层面粗犷捕获和处理异常。为了理解错在何处&#xff0c;先看看大多数业务应用都…

python学习2之sublime text编辑器安装配置使用

1、在windows系统中使用sublime text 下载地址 https://www.sublimetext.com/3 2、在sublime text中运行python程序 代码运行可选择菜单Tools->Build或者按CtrlB 3、定制sublime text的设置 3.1将制表符转换为空格 选择菜单view->indentation,核实选择了复选框indent u…

【1++的数据结构】之AVL树

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的数据结构】 文章目录 一&#xff0c;什么是AVL树二&#xff0c;AVL树的插入三&#xff0c;AVL树的旋转3.1 向左旋转3.2 向右旋转3.3 左右双旋3.4 右左双旋 四&#xff0c;验证AVL树是否平衡 …

前端学习之轮播图

前端学习之轮播图 该案例涉及到定时器的使用&#xff0c;元素的活获取&#xff0c;函数的调用等知识的运用 显示图如下&#xff1a;可以点击图标跳转图片&#xff0c;也可以自动轮播 源码如下 <!DOCTYPE html> <html><head><meta charset"UTF-8&q…

监控抽烟检测识别算法

监控抽烟检测识别算法采用yolov7系列网络模型深度学习图像识别技术&#xff0c;监控抽烟检测识别算法能够准确识别人员抽烟的动作和烟雾&#xff0c;监控抽烟检测识别算法一旦发现有人员在禁烟区域内抽烟&#xff0c;将立即触发预警。YOLO的结构非常简单&#xff0c;就是单纯的…

正中优配:“核污染防治”炒作按下暂停键, 中电环保、建龙微纳大跌

连日大涨的核污染防治炒作“步伐”放缓。 8月29日上午&#xff0c;核污染防治概念股多数低开&#xff0c;截止到午间休市&#xff0c;此前4个交易日累计涨超80%的中电环保&#xff08;300172.SZ&#xff09;大跌6.76%。 8月28日晚间&#xff0c;中电环保发布异动公告&#xff…

遗传算法决策变量降维的matlab实现

1.案例背景 1.1遗传算法概述 遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。它最初由美国Michigan大学的J. Holland教授提出,1967年, Holland 教授的学生 Bagley在其博士论文中首次提出了“遗传…