文档章节

批量update遇到的问题

harveyno1
 harveyno1
发布于 2017/07/18 18:44
字数 450
阅读 7
收藏 0

项目开发中遇到一个问题,需要一次性更新大概8000条数据,业务场景是预售倒计时,定时任务每秒刷新该方法一次,本机8g内存更新时间20-30秒以上,显然是不能接受的,换种思路最终解决了问题,终耗时不到1秒,将实现过程总结如下:

一.通过创建临时表来解决问题

1.先创建一个临时表

create temporary table xxx_tmp(id int(11) primary key,`loanstate` int(2))

2.插入要更新的记录

insert into xxx_tmp values  (0,'gone'), (1,'xx'),...(m,'yy');

3.通过表连接更新数据

update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id;

二.延伸的问题

insert into的过程中,values值比较多,因为是动态的,需要通过代码拼接好,采用了group_concat的方式连接values值:

select group_concat(cast(concat(concat(concat(concat("(",column),","),2),")") as char)) from loansign_pool_relation where column=xxx ;

因为group_concat返回的是blob类型,不能直接赋值给字符串,所以通过cast转成char类型

需要注意的是group_concat最大长度1024,超过长度的话会截取掉后面的部分

这里通过下面几种方式可以改变这个长度:

 1).在MySQL配置文件中加上

        group_concat_max_len = 102400 #你要的最大长度

 2).可以简单一点,执行语句,可以设置作用范围

         SET GLOBAL group_concat_max_len=102400;

         SET SESSION group_concat_max_len=102400;

 

完整的java实现方式:

 

Long startTime = System.currentTimeMillis() ;

String sql1 = "select group_concat(cast(concat(concat(concat(concat(\"(\",loanId),\",\"),2),\")\") as char)) from loansign_pool_relation where loanPoolId = "+id ;

Object obj = dao.findObjectBySql(sql1) ;

if(obj!=null){

    String sql = "create temporary table loan_tmp(id int(11) primary key,`loanstate` int(2))" ;

    dao.executeSql(sql) ;

    String insertSql="insert into loan_tmp values  "+obj.toString() ;

    dao.executeSql(insertSql) ;

    String updateSql = "update loansign l, loan_tmp t set l.loanstate=t.loanstate where l.id=t.id" ;

    dao.executeSql(updateSql) ;

}

Long endTime = System.currentTimeMillis() ;

System.out.println("=========更新loansign耗时:"+(endTime-startTime));

 

最终耗时不到1秒

© 著作权归作者所有

harveyno1
粉丝 0
博文 3
码字总数 2074
作品 0
信阳
私信 提问
mysql妙用:批量插入记录,遇到重复记录则为自动更新

在更新大量数据时可能同时遇到两个问题: 如果每条更新执行一次sql性能很低,也容易造成阻塞; 批量更新时又有可能遇到主键重复的问题 使用 ON DUPLICATE KEY UPDATE 一条sql解决批量更新和主...

码上有春天
2015/05/07
5.7K
0
Elasticsearch 入门: _bulk 批量导入数据

批量导入数据 使用 Elasticsearch Bulk API 批量 update 步骤: 需求:我希望批量导入一个 type 的名词列表到 index 索引。 准备数据: 根据官方文档,Json 数据要准备成这个格式的: 其中 ...

王兵
2018/05/10
0
0
MySQL 和 Innobackup 不定期卡住的秘密

最近很长时间,陆续有不少朋友跟我说他们的MySQL经常重启,卡住,然后结了一堆报错信息。 正好,自己之前也遇到过大批量的MySQL hang和innobackupex备份卡住的问题,一直没时间写,现在就分享...

兰春
2018/12/10
0
0
mybatis批量操作sql配置

在写批量sql操作时,遇到执行报错: update t_xxx set column1=#{item.column1} where id= #{item.id} 分析思路: 1.将sql语句打印出来,客户端执行,不报错; 2.执行单条时,不报错,只有多...

lar555
2018/12/10
17
0
mongodb学习 document具体操作

一、Document 数据插入: 1.插入文档 db.[documentName].insert({}) 2.批量插入文档 shell 这样执行是错误的db.[documentName].insert([{},{},{},……..]) shell 不支持批量插入 想完成批量插...

金馆长1
2015/11/21
85
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
210
4
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
10
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部