原因:
批量插入或更新数据量过大,易出现PacketTooBigException问题
方案一:
1、查看max_allowed_packet当前值:show VARIABLES like '%max_allowed_packet%';
2、举例设置更大值20M:set global max_allowed_packet = 20*1024*1024;
备注:有些版本在修改了值之后,需要退出当前session重新登录(或者关闭mysql客户端再次打开登录),才会看到值修改后的变化。
方案二:
1、编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改:max_allowed_packet = 20M
2、在当前目录及子目录下查找名称中包含conf的文件: $ find . -type f -name "*conf*"
方案三:
分多次插入或更新数据
// 1、设定每次插入1000条数据
int batchSize = 1000;
// 2、获取总共插入次数
int step = (longOrderList.size() % batchSize == 0) ? (longOrderList.size() / batchSize) : (longOrderList.size() / batchSize + 1);
// 3、存储总共插入的条数
int success = 0;
// 分批插入并计算当前已插入的总条数
for (int i=0; i < step; i++) {
List<Map<String, Object>> subList = null;
if (i == step -1){
subList = longOrderList.subList(i * batchSize, longOrderList.size());
}else {
subList = longOrderList.subList(i * batchSize, (i+1) * batchSize);
}
success += serOrderParkingService.insertUnusualOrderBatch(subList);
}
logger.info("批量插入超长订单条数{}",success);
if (success != longOrderList.size()){
logger.error("超长订单--批量插入和要插入的数据大小不一致!");
}