V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
6666666666666666
V2EX  ›  Java

Java 导出报表过慢问题

  •  
  •   6666666666666666 · 2020-07-14 11:59:06 +08:00 · 2537 次点击
    这是一个创建于 1597 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近发现项目(前后端分离)导出报表过慢,后来发现导出结果集其实很快(几秒),只是查询很慢(几十秒甚至几分钟),但是报表太多了,全是大的 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 呢?
    11 条回复    2020-07-15 07:30:24 +08:00
    siweipancc
        1
    siweipancc  
       2020-07-14 12:39:58 +08:00 via iPhone
    ಠ_ಠ 我们是按主体个数开线程 countdown 的。
    skypyb
        2
    skypyb  
       2020-07-14 12:46:34 +08:00 via Android
    异步。 点导出之后让用户去主动下载导出文件
    micean
        3
    micean  
       2020-07-14 12:58:12 +08:00
    瓶颈在数据库的话,开几个线程都没用
    如果是 OLAP 的就半夜跑任务
    如果是 OLTP 的就减少查询量
    一定要混着用……改成新开一个窗口,js 控制伪进度,让用户等吧
    ZehaiZhang
        4
    ZehaiZhang  
       2020-07-14 13:09:15 +08:00
    之前都是半夜定时生成报表,早上他们再自己下
    6666666666666666
        5
    6666666666666666  
    OP
       2020-07-14 13:17:02 +08:00
    @micean @ZehaiZhang 我就是凌晨定时生成的报表,只是查询报表不是查所有,是查询该账号下能查到的数据并导出,每个帐号挂多个角色,报表的每个行有个 type 然后 type in ('2','3'..该帐号下的角色),就是这样查报表的,所以每个帐号生成的数据都不一样的。
    weizhen199
        6
    weizhen199  
       2020-07-14 13:37:30 +08:00
    赌五毛会更慢
    buzailianxi
        7
    buzailianxi  
       2020-07-14 13:44:51 +08:00
    不改不现实,取出所有 type 的数据 or 所有 type 的数据放 redis,思路就是预先准备数据集合,导出的时候直接取就可以。
    yizmaoaa
        8
    yizmaoaa  
       2020-07-14 15:37:32 +08:00
    - - 你开多线程去 CountDownLautch 估计速度也是差不多。主数据源放内存里吧。只要你走数据库。导出大量数据必然是慢
    starcraft
        9
    starcraft  
       2020-07-14 15:44:50 +08:00 via iPhone
    bug 不 bug 不知道,但就你提供这个方法,大概率是变慢,而不是在优化。
    greatbody
        10
    greatbody  
       2020-07-14 15:51:22 +08:00
    分析清楚报表的取数逻辑。在梳理清楚的基础上,进行 SQL 优化,能用存储过程的,用存储过程。减少和数据库的交互,提高数据库计算的效率。
    lqw3030
        11
    lqw3030  
       2020-07-15 07:30:24 +08:00 via iPhone
    应该是异步而不是多线程,这种长阻塞的场景多线程会导致线程全部挂起
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3440 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:22 · PVG 19:22 · LAX 03:22 · JFK 06:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.