接口耗时优化, 并发数和 响应时间 关系
ProcessThreadPool.getBTaskThreadPool(50).loadTasks(new UpdateConsumptionRecordLogThread(log);
//批量更新 ---> 并发更新
//Integer result = consumptionDetailBusiness.updateConsumptionDetails(list));
int splitListSize = 100;
List<List<PersonConsumptionDetailBo>> lists = ListUtil.splitList(listPersons, splitListSize);
ExecutorService service = ProcessThreadPool.getExecutorService(lists.size() + 1);
List<FutureTask<Integer>> futureTaskList = new ArrayList<>();
for (List<PersonConsumptionDetailBo> list : lists) {
FutureTask<Integer> futureTask = new FutureTask<>(
() -> consumptionDetailBusiness.updateConsumptionDetails(list)
);
futureTaskList.add(futureTask);
service.submit(futureTask);
result = list.size();
}
public static ExecutorService getExecutorService(int threadPoolSize) {
if (threadPoolSize <= 0) {
threadPoolSize = THREAD_POOL_SIZE;
}
ExecutorService service = Executors.newFixedThreadPool(threadPoolSize);
return service;
}
int splitListSize = 100;
result = future.get():耗时:13893
result = future.get():耗时:14306
result = future.get():耗时:14306
result = future.get():耗时:14306
result = future.get():耗时:15316
result = future.get():耗时:15316
result = future.get():耗时:15421
result = future.get():耗时:15421
int splitListSize = 50;
result = future.get():耗时:10539
result = future.get():耗时:10619
result = future.get():耗时:10619
result = future.get():耗时:10619
result = future.get():耗时:10619
int splitListSize = 30;
result = future.get():耗时:6096
result = future.get():耗时:6096
result = future.get():耗时:6376
result = future.get():耗时:6376
result = future.get():耗时:6376
result = future.get():耗时:6376
1. 从 表取「目标数据」时,开启多线程,进行分页筛选,将获取到的「目标数据」存放到 `result` 列表中。
//分页大小 默认 5000
int pageSize = this.getPageSize();
//页码数
int pageCnt = totalNum / this.getPageSize() + 1;
List<Map<String, Object>> result = Lists.newArrayList();
List<Future<List<Map<String, Object>>>> futureList = new ArrayList<>(pageCnt);
//开启多线程调用
for (int i = 1; i <= pageCnt; i++) {
//将业务配置的筛选规则和排序规则 构建为 SelectionQueryCondition 对象
SelectionQueryCondition selectionQueryCondition = buildSelectionQueryCondition(selectionQueryRuleData);
selectionQueryCondition.setPageSize(pageSize);
selectionQueryCondition.setPage(i);
futureList.add(selectionQueryEventPool.submit(
new QuerySelectionDataThread(selectionQueryCondition))
);
}
for (Future<List<Map<String, Object>>> future : futureList) {
//RPC 调用
List<Map<String, Object>> queryRes = future.get(20, TimeUnit.SECONDS);
if (CollectionUtils.isNotEmpty(queryRes)) {
// 将目标数据存放在 result 中
result.addAll(queryRes);
}
}
2. 对目标数据 `result` 进行排序,得到最终的「结果数据」。