我的投机取巧竟然忘了mysql还有一个最大值的限制

发布时间: 2020-01-08 00:01:36 来源: 老徐聊技术 栏目: 科技新闻 点击: 161

前言:项目开发中没有考虑到数据量的问题,在运行阶段突然有一天报Packet for query is too large

前言:项目开发中没有考虑到数据量的问题,在运行阶段突然有一天报Packet for query is too large错误。这里先说个例子,比如有10条数据需要插入到数据库。我们通常的实现是:List

list = new ArrayList<>();for(int i=0;i

而我不想在循环list了,我想一条sql搞定,因为mysql不是可以insert into table values(?,?),(?,?),(?,?)这样写吗。我在mybatis中使用foreach就可以实现了。List

list = new ArrayList<>();Map

map = new HashMap

();map.put("list",list);insert(map);

如下mybatis中foreach的写法,collection中的list就是我map中的list。

我的投机取巧竟然忘了mysql还有一个最大值的限制

foreach写法

但是这里有个bug,我没有考虑到mysql中有一个大小限制,即max_allowed_packet。

项目这是运行后,发现有一个大账户,插入一直报错,查看日志发现如图错误。

我的投机取巧竟然忘了mysql还有一个最大值的限制

报错信息

Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large

意思就是我超过Packet的最大限制了。也就是我上面提到的max_allowed_packet这个参数。查看这个参数:

我的投机取巧竟然忘了mysql还有一个最大值的限制

查看max_allowed_packet

1048576字节=1M,也就是mysql默认的。那么问题来了,我是修改这个参数,还是另寻其它解决办法。我选择了最后一个。原因:

因为线上数据库不允许重启,网上百度说设置这个参数后,重启才能生效。

这个值设置多大合适不知道,我这次设置为2M,下次可能出现个3M的情况。

不知道大家有没有实现过采用文件的形式插入数据,即load方式。

我的实现方式,先把数据写入到csv文件里,我通过load把这个文件的数据插入到数据库。

我的投机取巧竟然忘了mysql还有一个最大值的限制

load方式

这里呢一定要注意编码问题,不然会乱码还有数据之间是采用什么分隔的,如csv就是使用“,”分隔。

csv文件导入的sql:LOAD DATA LOCAL INFILE 'E:/1111.csv' ignore into table qwe1231 CHARACTER SET utf8 fields terminated by ',' enclosed by "" IGNORE 1 LINES

总结:

在查询大数据量和插入大数据量数据时,一定要注意max_allowed_packet的值问题,这里我们可以采用分页查询,分页插入。

load方式在处理大数据量问题还是比较容易的,而且速度很快。

本文标题: 我的投机取巧竟然忘了mysql还有一个最大值的限制
本文地址: http://www.021guibang.com/keji/3362321.html

如果认为本文对您有所帮助请赞助本站

支付宝扫一扫赞助微信扫一扫赞助

  • 支付宝扫一扫赞助
  • 微信扫一扫赞助
  • 支付宝先领红包再赞助
    声明:凡注明"本站原创"的所有文字图片等资料,版权均属上海贵邦新闻网所有,欢迎转载,但务请注明出处。
    豪威发布 1/1.3 英寸手机 CMOS:4800 万像素,支持 4K 60 帧视频拍摄返回列表
    Top