报错信息

1
Packet for query is too large (6071393 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.

报错SQL

1
2
insert into table_name(col1,col2) 
values (1, 2),(1, 3) ....;

原因

    批量插入数据时,以上SQL肯定是首选,在java中使用for循环插入,效率肯定要低。但是数据量超大时,以上sql会报错,是因为msql默认限制了。

解决办法

修改mysql配置
  1. 修改 my.ini, 添加以下配置。67108864则是大小,单位为字节。需要根据自己项目需求修改大小。需要重启mysql服务
    1
    max_allowed_packet =67108864
  2. 也可以登录mysql使用以下命令
    1
    set global max_allowed_packet = 67108864;
  3. 查看是否生效
    1
    show VARIABLES like '%max_allowed_packet%';
java中控制插入条数(推荐)

    以上方法虽然能解燃眉之急,但是如何保证以后不会超过你设置的值?当达到一定量时,JVM也会内存溢出,数据库压力也扛不住。

1
2
3
4
5
6
7
import com.google.common.collect.Lists;

List<Object> data = dosomething();
List<List<Object>> temp = Lists.partition(data, 1000);
for(List<Object> item : temp){
insert(item);
}

    以上代码为,将要修改数据分隔成多份,每一份的大小为1000(不要写魔法值哦)个。每一份插入一次。