plugin-report-parallel-loader

源码

取数部分

  • com.fr.report.core.cal.SE#SE(com.fr.report.worksheet.WorkSheet, java.util.Map<java.lang.String,java.lang.Object>, com.fr.report.core.sheet.SheetSequenceExecutor)
    • com.fr.report.core.cal.SE#additionalInitForDataSourcePoolProcessor
      • com.fr.plugin.parallel.loader.ParallelDataSourceLoader#parallelLoad(com.fr.script.Calculator, boolean, java.lang.String)
        • com.fr.plugin.parallel.loader.core.SessionSharedDSLoadPool#preLoad
          • 先创建 DataModel com.fr.base.SynchronizedLiveDataModelUtils#createDefaultDBDataModel(com.fr.data.impl.DBTableData, java.lang.String, int)
            • 525
            • 这里会记录 SQL 并且和 TimeLoggerInfor 的形式不一样。
              • TimeLoggerInfor 被用来记录计算中的各种耗时
                • 记录器是 com.fr.general.log.TimeLoggerInfor
                • 输出器是 com.fr.general.log.LoggerOutput#log
          • 创建 com.fr.plugin.parallel.loader.core.LoadTask

相比串行的优势

// com.fr.plugin.parallel.loader.core.LoadTask
 
columnCount = dataModel.getColumnCount();
rowCount = dataModel.getRowCount();

loadTask 会计算两部分内容,

  • 一部分是 getColumnCount,其中会处理 com.fr.data.impl.AbstractDBDataModel#initConnectionAndResultAndCheckInColumns
    • com.fr.report.core.cal.SE#dealWithBEDSColumn(com.fr.report.core.cal.BE, com.fr.report.cell.cellattr.core.group.DSColumn)
  • 一部分是 getRowCount,其中会处理 com.fr.data.impl.AbstractDBDataModel#iterateResultSet(com.fr.data.impl.IterateResultSetListener, com.fr.general.data.DataModel)
    • com.fr.report.core.cal.SE#cc_be_source

这就是比串行的优势。目前日志中只记录了 getRowCount 的时间。

计算部分

  • com.fr.report.core.cal.SE#dealWithBEDSColumn(com.fr.report.core.cal.BE, com.fr.report.cell.cellattr.core.group.DSColumn)
    • com.fr.report.core.cal.SE#dealWithEmptyDM
      • com.fr.base.SynchronizedLiveDataModelUtils#getLiveDataModel
        • com.fr.plugin.parallel.loader.ParallelDataSourceLoader#getLoadedDataModel
          • com.fr.plugin.parallel.loader.core.SessionSharedDSLoadPool#getDataModel

BUG

JS实现分sheet导出excel效率慢

确认是否是网络问题。查看 f12, 确认全部阻塞在服务器中
查看源码,发现老的逻辑 导出 PDF 会转发一层,尝试关上,没有效果
后台打堆栈,发现堆栈没有任何异常,查看 localhost_access.log 发现请求没有过来。猜测是集群负载均衡的问题。
将 ip 变为 ip:port 的方式,选中固定的服务器
查看堆栈,发现是阻塞在取数部分。

对比一下直接导出的部分。
560
500
发现使用 GroupTemplateReportlet 的部分, 没有并行计算。