一、报错信息
Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (8808741 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
二、问题说明
"Packet for query is too large" 错误,这个错误提示意味着 MySQL 数据包大小超过了服务器设置的限制。
在使用 MySQL 进行查询或插入操作时,如果数据包的大小超过了服务器设置的最大限制,就会出现 "Packet for query is too large" 错误。默认情况下,MySQL 的最大数据包大小是 4MB(4194304 字节)。
三、解决方法
要解决这个问题,可以通过修改 MySQL 服务器的配置来增加最大数据包大小限制。
修改的方式有两种,一种是配置文件永久修改,另一种是临时动态修改,重启mysql后会复原。
方法一:修改 MySQL 配置文件(永久修改)
1. 找到 MySQL 的配置文件,通常是 my.cnf 或 my.ini。
2. 在配置文件中找到 [mysqld] 段落。
3. 添加或修改以下行:
max_allowed_packet = 16M
这里的 16M 表示最大数据包大小为 16MB,可以根据需要调整大小。
方法二:动态修改 MySQL 参数(临时修改,重启失效)
如果无法访问 MySQL 的配置文件,可以通过 MySQL 客户端动态修改参数。
1. 打开 MySQL 客户端,输入以下命令登录:
mysql -u 用户名 -p
2.查看最大数据包大小:
show VARIABLES like '%max_allowed_packet%';
3. 执行以下命令修改最大数据包大小:
SET GLOBAL max_allowed_packet=16777216;
这里的 16777216 是 16MB 对应的字节数(16 * 1024 * 1024)。
注意事项
● 修改 MySQL 配置文件后,需要重启 MySQL 服务才能生效。
● 增大数据包大小会占用更多内存,需要根据服务器配置和实际需求进行调整,避免影响系统性能。
备注
从代码的角度也可以解决这个问题,比如限制每次只允许操作1000条数据,下面是一个示例代码:
List<SignTimeBean> batchList = new ArrayList<>();
…… // 填入数据代码
int batchSize = 1000;
int totalSize = insertList.size();
for (int i = 0; i < totalSize; i += batchSize) {
int end = Math.min(totalSize, i + batchSize);
List<SignTimeBean> batchList = insertList.subList(i, end);
if (!batchList.isEmpty()) {
signTimeBeanMapper.insertBatch(batchList);
}
}
这里的代码逻辑是:
1. 设置每个批次的大小为1000条。
2. 获取 insertList 的总大小。
3. 使用一个循环,将 insertList 切分成多个批次,每个批次的大小不超过1000条。
4. 对于每个批次,调用 insertBatch 方法执行插入操作。
这个方法可以确保即使 insertList 中有超过1000条数据,也能分批处理,避免一次性插入过多数据可能引发的问题。