分批次插入mysql:一次性插入mysql两万以上数据造成数据库假死
来源:互联网 发布:qq在mac上截图快捷键 编辑:程序博客网 时间:2024/06/06 09:28
项目距离上线的日期越来越近了,需要规范一下数据库中的数据,就需要从前端页面上导入系统数据到mysql数据库。导入3万数据,期间会有校验,最后分别插入到四张表中,本库插入3张表,云平台插入一张表,运行到一半的时候就前端页面假死了,最后通过分批插入数据解决问题,以下是实验并解决的过程。
1.实验条件
笔记本型号:戴尔,I3处理器,12G内存条
2.项目框架
本项目为前后端分离。
前端:Angular
后端:SSM+Dubbo+Mysql数据库
3.实验过程
插入数据库的是批量的插入,最后的sql语句类似于insert into t_test (cloumn_a,cloumn_b) values(1,2),(3,4),(5,6).
①一次性批量插入数据库(四张表)
结果:dubbo超时,由于中间需要有其他的操作,例如,学号重复的校验,身份证号的校验等,导致还没有到插入数据库的一步就已经dubbo超时了,我们设置的dubbo超时时间是3s.
②一次性批量插入数据库(单表插入)
我们将dubbo超时时间设置到保证不会超时,如10min,mysql报错,意思为传输的数据包太大了,超过了数据库配置的可接收的最大值.
使用命令连接mysql,使用命令查看mysql的配置:show VARIABLES like '%max_allowed_packet%';发现太小,然后设置的大一点,设置为20M,set global max_allowed_packet = 2*1024*1024*10
将学号重复的校验去掉,其中会为每条数据设置UUID(业务需要),测试数据量是3W,结果是可以入库,数据量大小是4.8min左右.
③公共方法tool中分批次1000一批次(单表插入)
我们将dubbo超时时间设置到保证不会超时,如10min,将学号重复的校验去掉,其中会为每条数据设置UUID(业务需要),测试数据量是3W,结果是可以入库,数据量大小是4min左右.
④除去入库和和学号校验,基础代码循环设置uuid
结果:1min
⑤除去学号校验,入库4张表,基础代码循环设置uuid
dubbo报错,dubbo不支持这么大的数据包
4.解决方法
private static int batchCount=500; //500条数据一批次
@Override @Transactional(rollbackFor = Exception.class) public int insertAll(List<T> records) { int result = 0; if (records != null) { int recCount = records.size(); if (recCount > 0 && recCount <= batchCount) { for (T record : records) { wrapBaseEntity(record); } result = getRealDao().insertAll(records); } if (recCount > batchCount) { int times = recCount / batchCount; int residue = recCount % batchCount; if (residue > 0) { times = times + 1; } for (int i = 0; i < times; i++) { if (i == times - 1) { for (T record : records.subList(batchCount * i, recCount)) { wrapBaseEntity(record); } result = result + getRealDao().insertAll(records.subList(batchCount * i, recCount)); } else { for (T record : records.subList(batchCount * i, batchCount * (i + 1))) { wrapBaseEntity(record); } result = result + getRealDao().insertAll(records.subList(batchCount * i, batchCount * (i + 1))); } } } } return result; }
5.总结
- 分批次插入mysql:一次性插入mysql两万以上数据造成数据库假死
- mysql分批次插入VS一次性插入
- php+mysql实现数据分批插入
- php分批次批量插入数据
- 将大数据,分批分段,插入数据库
- 将大数据,分批分段,插入数据库
- C#一次性插入多条数据到mysql
- MySql数据库插入数据乱码
- 插入数据到MySql数据库
- [Php-Mysql]多条数据的循环插入和一次性插入的性能测试
- 一次性把DataTable中的数据插入数据库
- 一次性把DataTable中的数据插入数据库 .
- 一次性把DataTable中的数据插入数据库
- mysql数据库创建,表创建,插入数据
- vc对mysql数据库插入数据
- mysql数据库创建,表创建,插入数据
- hibernate连接mysql数据库自动插入数据
- mysql数据库插入数据中文乱码
- 图像剪裁
- fasttext的简单介绍
- spring mvc项目的jsp找不到CSS,JS加载
- Tab 切换
- discuz插件操作数据库实例
- 分批次插入mysql:一次性插入mysql两万以上数据造成数据库假死
- 零基础学python-初识http
- centOS7下FTP服务器安装与配置
- 用python做自动化测试--Andriod App 的自动化-Appium的那些坑
- Dev中更改SimpleButton的颜色
- BZOJ1997 [Hnoi2010]Planar
- Map中的containsKey()方法
- spring各种邮件发送
- Discuz!X数据库函数操作命令大全