Java 导出报表过慢问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
6666666666666666
V2EX    Java

Java 导出报表过慢问题

  •  
  •   6666666666666666 2020 年 7 月 14 日 3278 次点击
    这是一个创建于 2078 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近发现项目(前后端分离)导出报表过慢,后来发现导出结果集其实很快(几秒),只是查询很慢(几十秒甚至几分钟),但是报表太多了,全是大的 sql 语句
    所以我在想是否可以在不修改业务代码的情况下提高导出效率,所以我准备用多线程实现。项目用的 MyBatis,我的想法:
    是否可以写个对 Executor.class 的 query 方法的拦截,
    @Intercepts({@Signaure(type = Executor.class, method = "query",
    args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})
    })
    然后把大 sql 先 count 下计算下总数,如果超过 10 万行我就 limit 方式分解多条 sql, 然后多个线程去跑,最后把结果集合并。
    老哥们觉得如何,是否有啥 bug 呢?
    11 条回复    2020-07-15 07:30:24 +08:00
    siweipancc
        1
    siweipancc  
       2020 年 7 月 14 日 via iPhone
    _ 我们是按主体个数开线程 countdown 的。
    skypyb
        2
    skypyb  
       2020 年 7 月 14 日 via Android
    异步。 点导出之后让用户去主动下载导出文件
    micean
        3
    micean  
       2020 年 7 月 14 日
    瓶颈在数据库的话,开几个线程都没用
    如果是 OLAP 的就半夜跑任务
    如果是 OLTP 的就减少查询量
    一定要混着用……改成新开一个窗口,js 控制伪进度,让用户等吧
    ZehaiZhang
        4
    ZehaiZhang  
       2020 年 7 月 14 日
    之前都是半夜定时生成报表,早上他们再自己下
    6666666666666666
        5
    6666666666666666  
    OP
       2020 年 7 月 14 日
    @micean @ZehaiZhang 我就是凌晨定时生成的报表,只是查询报表不是查所有,是查询该账号下能查到的数据并导出,每个帐号挂多个角色,报表的每个行有个 type 然后 type in ('2','3'..该帐号下的角色),就是这样查报表的,所以每个帐号生成的数据都不一样的。
    weizhen199
        6
    weizhen199  
       2020 年 7 月 14 日
    赌五毛会更慢
    buzailianxi
        7
    buzailianxi  
       2020 年 7 月 14 日
    不改不现实,取出所有 type 的数据 or 所有 type 的数据放 redis,思路就是预先准备数据集合,导出的时候直接取就可以。
    yizmaoaa
        8
    yizmaoaa  
       2020 年 7 月 14 日
    - - 你开多线程去 CountDownLautch 估计速度也是差不多。主数据源放内存里吧。只要你走数据库。导出大量数据必然是慢
    starcraft
        9
    starcraft  
       2020 年 7 月 14 日 via iPhone
    bug 不 bug 不知道,但就你提供这个方法,大概率是变慢,而不是在优化。
    greatbody
        10
    greatbody  
       2020 年 7 月 14 日
    分析清楚报表的取数逻辑。在梳理清楚的基础上,进行 SQL 优化,能用存储过程的,用存储过程。减少和数据库的交互,提高数据库计算的效率。
    xyooyx
        11
    xyooyx  
       2020 年 7 月 15 日 via iPhone
    应该是异步而不是多线程,这种长阻塞的场景多线程会导致线程全部挂起
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6127 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:51 PVG 09:51 LAX 18:51 JFK 21:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86