源码
取数部分
- 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)
- 这里会记录 SQL 并且和 TimeLoggerInfor 的形式不一样。
- TimeLoggerInfor 被用来记录计算中的各种耗时
- 记录器是 com.fr.general.log.TimeLoggerInfor
- 输出器是 com.fr.general.log.LoggerOutput#log
- TimeLoggerInfor 被用来记录计算中的各种耗时
- 这里会记录 SQL 并且和 TimeLoggerInfor 的形式不一样。
- 创建 com.fr.plugin.parallel.loader.core.LoadTask
- 先创建 DataModel com.fr.base.SynchronizedLiveDataModelUtils#createDefaultDBDataModel(com.fr.data.impl.DBTableData, java.lang.String, int)
- com.fr.plugin.parallel.loader.core.SessionSharedDSLoadPool#preLoad
- com.fr.plugin.parallel.loader.ParallelDataSourceLoader#parallelLoad(com.fr.script.Calculator, boolean, java.lang.String)
- com.fr.report.core.cal.SE#additionalInitForDataSourcePoolProcessor
相比串行的优势
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)
- com.fr.report.core.cal.SE#
- 一部分是
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
- com.fr.report.core.cal.SE#
这就是比串行的优势。目前日志中只记录了 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
- com.fr.plugin.parallel.loader.ParallelDataSourceLoader#getLoadedDataModel
- com.fr.base.SynchronizedLiveDataModelUtils#getLiveDataModel
- com.fr.report.core.cal.SE#dealWithEmptyDM
BUG
确认是否是网络问题。查看 f12, 确认全部阻塞在服务器中
查看源码,发现老的逻辑 导出 PDF 会转发一层,尝试关上,没有效果
后台打堆栈,发现堆栈没有任何异常,查看 localhost_access.log 发现请求没有过来。猜测是集群负载均衡的问题。
将 ip 变为 ip:port 的方式,选中固定的服务器
查看堆栈,发现是阻塞在取数部分。
对比一下直接导出的部分。
发现使用 GroupTemplateReportlet 的部分, 没有并行计算。