Java 导出报表过慢问题

Java 导出报表过慢问题,第1张

Java 导出报表过慢问题,第2张

最近发现项目(前后端分离)导出报表过慢,后来发现导出结果集其实很快(几秒),只是查询很慢(几十秒甚至几分钟),但是报表太多了,全是大的 sql 语句
所以我在想是否可以在不修改业务代码的情况下提高导出效率,所以我准备用多线程实现。项目用的 MyBatis,我的想法:
是否可以写个对 Executor.class 的 query 方法的拦截,
@Intercepts({@Signature(type = Executor.class, method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})
})
然后把大 sql 先 count 下计算下总数,如果超过 10 万行我就 limit 方式分解多条 sql, 然后多个线程去跑,最后把结果集合并。
老哥们觉得如何,是否有啥 bug 呢? ----------------------- 以下是精选回复-----------------------

答:ಠ_ಠ 我们是按主体个数开线程 countdown 的。
答:异步。 点导出之后让用户去主动下载导出文件
答:瓶颈在数据库的话,开几个线程都没用
如果是 OLAP 的就半夜跑任务
如果是 OLTP 的就减少查询量
一定要混着用……改成新开一个窗口,js 控制伪进度,让用户等吧
答:之前都是半夜定时生成报表,早上他们再自己下
答:赌五毛会更慢
答:不改不现实,取出所有 type 的数据 or 所有 type 的数据放 redis,思路就是预先准备数据集合,导出的时候直接取就可以。
答:- - 你开多线程去 CountDownLautch 估计速度也是差不多。主数据源放内存里吧。只要你走数据库。导出大量数据必然是慢
答:bug 不 bug 不知道,但就你提供这个方法,大概率是变慢,而不是在优化。
答:分析清楚报表的取数逻辑。在梳理清楚的基础上,进行 SQL 优化,能用存储过程的,用存储过程。减少和数据库的交互,提高数据库计算的效率。
答:应该是异步而不是多线程,这种长阻塞的场景多线程会导致线程全部挂起

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Java 导出报表过慢问题

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情