最近接到一个需求,需要将列表中的数据导出为excel,要求是导出的数据和列表数据一致,导出的筛选条件和列表的筛选条件一致。当初做的时候就想着偷懒,所以数据查询和组装逻辑都和列表的一致,只是最后多了导出这一步。那么问题就来了,数据量大的时候直接超时……
首先想到的解决方案是使用多线程处理数据,反复调节数据组大小和线程数,结果发现即使开20个线程也还是照样超时……所以这条路是走不通的。
最后问组内老哥,发现问题所在:查询步骤是先找出所有满足条件的批次号,然后遍历查询订单的相关信息进行组装,对于列表查询是没有问题的,反正一页最多一百条,但是对于数据导出动不动几千上万条来说就太慢了。其实原本的导出逻辑是批量查询的,只是后来给我改成按列表查询的逻辑来了……所以最后问题的解决方法就是改成批量查询。后面才发现之前能写批量查询是因为没有那几个需要联表求和字段……
后来就参考列表查询逻辑梳理出每个数据来源于哪个表哪个字段,经过一番尝试(参考联表查询求和的一些问题)最后还是成功解决问题了,过程很痛苦,但还是学到很多。
总结:对于大数据量的查询,必须使用in进行批量查询,尽量减少查询次数,从根本上解决速度慢的问题
因为目前数据量其实还不是很大(10w以下),所以改成批量查询就能解决问题了,但是对于真正的大数据来说还要应对以下问题:
1.内存溢出
2.excel数据分sheet,压缩
所以如果数据量真正达到百万级别的话,最后的解决部分还是做异步导出。
Java将数据导出为excel的一些思考
最新推荐文章于 2025-01-17 21:10:41 发布