【Bug解决】Packet for query is too large (8808741 > 4194304). You can change this value on the server by

一、报错信息

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条数据,也能分批处理,避免一次性插入过多数据可能引发的问题。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值