mysql5中大数据错误:Packet for query is too large

本文介绍了解决MySQL在批量插入大数据时遇到的PacketTooBigException错误的方法。通过调整max_allowed_packet参数或采用分批插入策略,有效避免了因数据包过大导致的系统错误。

mysql5中大数据错误:Packet for query is too large (***>***). You can change this value on the ser
今天做程序,批量插入10000 条数据报错.
解决方案1:
MySQL的一个系统参数:max_allowed_packet,其默认值为1048576(1M),
可以先查询一下:show VARIABLES like ‘%max_allowed_packet%’;
修改此变量的值:MySQL安装目录下的my.ini文件中的[mysqld]段中的"max_allowed_packet = 1M",如更改为4M(如果没有这行内容,增加一行),保存,重新启动MySQL服务。现在可以load大于1M的文件了。

因为我的已经是4m了,我也不知道太大了会有什么不好的影响.
我的方法:
批量,分批次,一次插入1000条
List abnormalList = nbMouldinfoService.getFromNbInfoWhereOperateIs(0);

        List<NbMouldinfo> listToInsert = new ArrayList<>();

/**
* //批量插入,做了唯一校验,insert ignore into,避免重复插入,
* 如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据
/
if(!abnormalList.isEmpty()){
StringBuilder bd = new StringBuilder();
for (int i = 0; i < abnormalList.size(); i++) {
NbMouldinfo nbMouldinfo = abnormalList.get(i);
nbMouldinfo.setNewDate(new Date());
listToInsert.add(nbMouldinfo);
/
*
* 每1000条插入一次,
* 避免数据包太大 超出 mysql 中max_allowed_packet值,
* 而报错Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large
*/
if(i % 1000 == 0 && i>0){
//批量插入
nbMouldinfoAbnormalService.addBatch(listToInsert);
//重置listToInsert
listToInsert = new ArrayList<>();
}
}
//循环结束后将剩下的不满1000条的数据插入
nbMouldinfoAbnormalService.addBatch(listToInsert);
logger.info(“插入信号异常,模具号有:”+ bd);
}
}

<think>首先,用户的问题是关于解决MySQL异常:com.mysql.jdbc.PacketTooBigException: Packet for query is too large (40 > -1)。用户提供了多个引用,这些引用讨论了类似的问题和解决方案。 关键点: - 异常信息:Packet for query is too large (40 > -1) - 在引用中,异常通常是由于MySQL的max_allowed_packet参数设置得太小,导致查询包过大。 - 解决方案包括调整max_allowed_packet参数的值,或者分批处理数据。 用户的问题中,异常显示40 > -1,这很奇怪,因为-1通常表示没有限制。但在MySQL中,max_allowed_packet不能是负数。引用[5]提到类似问题,其中服务器配置的max_allow_packet太小。 分析用户的问题: - 错误信息:Packet for query is too large (40 > -1) - 40字节大于-1?这似乎不合理,因为-1可能表示无限或错误值。 - 在MySQL中,max_allowed_packet是一个无符号整数,不能为负。所以-1可能是一个错误或特殊情况。 回顾引用: - 引用[1]:解决PacketTooBigException,建议调整max_allowed_packet。 - 引用[2]:类似,导入大数据时异常,建议修改参数或分批插入。 - 引用[3]:原因和解决方案,分批插入数据。 - 引用[4]:设置global max_allowed_packet。 - 引用[5]:新装MySQL配置小,需要修改并重启数据库。 针对用户的具体错误(40 > -1),这可能是一个误报或特殊情况。但根本原因相同:max_allowed_packet设置不当。 解决方案步骤: 1. 确认max_allowed_packet的当前值。 2. 调整max_allowed_packet的值。 3. 考虑分批处理数据以避免大包。 4. 确保修改后重启MySQL服务。 在回答中,我需要: - 使用中文。 - 结构清晰,逐步解决问题。 - 引用相关段落时添加引用标识。 - 生成相关问题。 - 在数学表达式中使用$...$或$$...$$格式(虽然这里可能不需要,但如果有数字计算,要用)。 回答结构: 1. 解释异常原因。 2. 提供解决方案步骤。 3. 给出代码示例或命令。 4. 生成相关问题。 最终输出: - 回答部分。 - §§相关问题§§部分。 生成相关问题: - 基于主题,如如何预防此异常、其他优化方法等。</think>### 解决MySQL PacketTooBigException异常问题 您遇到的异常`com.mysql.jdbc.PacketTooBigException: Packet for query is too large (40 > -1)`是由于MySQL的`max_allowed_packet`参数设置不当导致的。该参数定义了MySQL服务器和客户端之间一次传输数据包的最大大小(单位:字节)。如果查询或插入的数据包大小超过此限制,就会触发此异常。在您的错误信息中,`40 > -1`表示实际数据包大小为40字节,但服务器配置的`max_allowed_packet`值异常(-1通常表示未设置或无效值)。这可能是MySQL配置错误或服务未正确加载参数所致。以下是系统化的解决方案,基于参考引用中的最佳实践[^1][^2][^3][^4][^5]。 #### 解决方案步骤 1. **确认当前参数值** 登录MySQL数据库,检查`max_allowed_packet`的当前设置。执行以下SQL命令: ```sql SHOW VARIABLES LIKE 'max_allowed_packet'; ``` 如果输出显示`-1`或一个很小的值(如2048字节),则说明参数需要调整[^5]。 2. **调整`max_allowed_packet`参数** - **临时修改(服务重启后失效)**: 在MySQL命令行中运行: ```sql SET GLOBAL max_allowed_packet = 64*1024*1024; -- 设置为64MB,根据需求调整 ``` 例如,如果数据包较大,建议设置为`64*1024*1024`(64MB)或更高[^4][^5]。 - **永久修改(需修改配置文件)**: 1. 找到MySQL配置文件(通常为`my.cnf`或`my.ini`)。 2. 在`[mysqld]`部分添加或修改行: ```ini max_allowed_packet = 64M ``` 3. 保存文件并重启MySQL服务: ```bash service mysql restart # Linux系统 # 或 net stop mysql && net start mysql # Windows系统 ``` 永久修改确保参数在重启后生效[^5]。 3. **分批处理数据(适用于大数据操作)** 如果异常发生在批量插入或查询操作中(如导入Excel数据),优先采用分批处理来避免大包: - 在代码中将数据分割成小批次。例如,使用Java的`Lists.partition`: ```java import com.google.common.collect.Lists; List<Data> dataList = ... // 原始数据列表 Lists.partition(dataList, 500).forEach(batch -> { // 每批500条 mapper.batchInsert(batch); // 执行插入 }); ``` 这能有效减少单次数据包大小,无需修改服务器参数[^3]。 4. **验证和测试** - 修改后,重新运行查询或导入操作。 - 如果问题依旧,检查MySQL错误日志(通常位于`/var/log/mysql/error.log`)确认参数是否生效[^5]。 #### 注意事项 - **重启服务关键性**:永久修改配置文件后必须重启MySQL,否则新值不会加载(常见错误原因)[^5]。 - **参数值计算**:设置`max_allowed_packet`时,需根据数据包大小估算。例如,如果最大数据包预计为10MB,则设置值应大于$10 \times 1024 \times 1024 = 10,485,760$字节[^4]。 - **安全考虑**:过大的`max_allowed_packet`可能增加内存压力,建议在测试环境先优化[^1]。 通过以上步骤,异常应能解决。如果问题复杂,提供更多上下文(如操作系统、MySQL版本)可进一步诊断。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值