Caused by: org.springframework.dao.TransientDataAccessResourceException:
### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException:
Packet for query is too large (104,647,915 > 67,108,864). You can change this value on the
server by setting the 'max_allowed_packet' variable.
### The error may involve com.xx.dao.xxDao.updateByxxs-Inline
### The error occurred while setting parameters
关键信息:
- 发送的 SQL 包大小:104,647,915 字节 ≈ 100 MB
- MySQL 允许的最大包:67,108,864 字节 = 64 MB(
SHOW VARIABLES LIKE 'max_allowed_packet'查询;) - 错误类型:PacketTooBigException —— 客户端发送的数据包超过了 MySQL 服务器的限制。
max_allowed_packet:是 MySQL 的一个配置项,用于限制:
- 单条 SQL 语句的最大长度
- 传输的数据包最大尺寸
- INSERT、UPDATE 中的字符串、BLOB 字段大小,默认值通常为 64MB(67,108,864 字节)。
解决:我这里遇到的是一次更新了上万条出现的数据包过大问题,这里设为批量5000更新一次
int batchSize = 5000;
for (List<xxDTO> batch : Lists.partition(xxDTOList, batchSize)) {
xxDao.updateByxxeDtos(batch);
}
这里并没有去改mysql的配置‘max_allowed_packet’,要重启才生效,测试环境还有机会,生产不敢,好像也没必要。