mysql数据包过大问题

62 阅读1分钟
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’,要重启才生效,测试环境还有机会,生产不敢,好像也没必要。