java调用python脚本生成图片错误

49 阅读2分钟

场景

spring boot 项目中调用 python 脚本,python 脚本生成对应的图片,然后拿到这个图片使用 poi-tl 插入到 word 文档当中。

问题

调用的过程中没有报错,但是 python 并没有生成对应的图片,查找到原因是因为 sql 中使用到了 GROUP_CONCAT 函数,但是该函数的长度只有 1024 ,修改长度为 102400 后生成图片没问题了。
测试在上线之后进行回归测试的时候发现,偶尔会有多月的文档导出的时候,图片生成也应该是多月,但是后面发现项目的数据量大的情况下还是无法生成图片。

解决思路

因为之前已经解决过 GROUP_CONCAT 函数长度问题,所以一开始并没有再考虑这个问题,而是考虑是否对应的依赖包在生产环境中没有添加,对应 pyhton 脚本调用的过程中是否调用成功等。
但是在排查问题的时候一直都没找到出问题的原因,后面是把调用 python 脚本的参数复制出来,放到记事本中排查发现问题,问题还是出现在 GROUP_CONCAT 函数的长度上面,就算长度调整为 102400 后多月的 数据还会存在超过这个长度的情况。

解决办法

由于 GROUP_CONCAT 长度已经设置很大了,不考虑继续改大 GROUP_CONCAT 的长度,转换思路后把所有的数据都查询出来,最后使用 java 进行拼接字符串,这样就不会造成长度限制的问题了,大致代码的思路如下:

// 查询 所以信息
List<DocItemSdDto> docItemSdDtos = this.baseMapper.listSd(totalProjectInfoReq,unitId);
Map<String,DocItemSdDto> map = new HashMap<>();
docItemSdDtos.stream().forEach(docItemSdDto -> {
    if(map.get(docItemSdDto.getTurbineId()) == null){
        map.put(docItemSdDto.getTurbineId(),docItemSdDto);
    }else {
        // 拼接数据
        DocItemSdDto dto = map.get(docItemSdDto.getTurbineId());
        dto.setA0102(dto.getA0102() + "," + docItemSdDto.getA0102());
        dto.setA0410(dto.getA0410() + "," + docItemSdDto.getA0410());
        dto.setA1004(dto.getA1004() + "," + docItemSdDto.getA1004());
        map.put(docItemSdDto.getTurbineId(),dto);
    }
});
List<DocItemSdDto> docItemSdDtoArr = new ArrayList<>();
map.forEach((key,value)->{
    docItemSdDtoArr.add(map.get(key));
});
return docItemSdDtoArr;

注意:如果使用到了GROUP_CONCAT 函数一定要考虑行转列之后出现的长度限制问题!!