场景描述
接口需要从系统1查询数据,查出的每条数据需要从另一个系统2中再去查询某些字段,
比如:从系统1中查出100条数据,每条数据需要去系统2中再去查询出行数据,可能系统1一条数据对应系统2的10条数据,这样数据量很大的情况下,这个接口很慢,如何解决
优化思路
结合业务考虑优化点: 分页查询、批量操作 、异步 、多线程、sql优化、表索引等优化、es整合数据放ES里… (道友们有补充的可以评论下哈)
这里的优化点:
优化1:考虑:分页查询 + 批量查询
优化2:开启2个线程去查,Future.get()会造成主线程阻塞,也就是当所有future都得到结果后主线程才能继续执行下去
示例代码:
package com.song.controller;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/*
多线程解决:当前系统接口需要去另外2个查询数据,并将数据拼接出来,返回前端系统数据,
优化1:分页查询 + 批量查询
优化2:开启2个线程去查,Future.get()会造成主线程阻塞,也就是当所有future都得到结果后主线程才能继续执行下去
*/
public class DataFetcher {
public String fetchDataFromSystem1() {
// 查询系统1的数据逻辑
String dataFromSystem1 = "Data from System 1";
return dataFromSystem1;
}
public String fetchDataFromSystem2() {
// 查询系统2的数据逻辑
String dataFromSystem2 = "Data from System 2";
return dataFromSystem2;
}
public String fetchDataFromSystems() throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 创建两个线程分别用于查询系统1和系统2的数据
Future<String> future1 = executorService.submit(() -> fetchDataFromSystem1());
Future<String> future2 = executorService.submit(() -> fetchDataFromSystem2());
// 等待两个线程执行完毕
String dataFromSystem1 = future1.get();
String dataFromSystem2 = future2.get();
// 拼接数据并返回结果
String combinedData = dataFromSystem1 + " | " + dataFromSystem2;
return combinedData;
}
public static void main(String[] args) {
DataFetcher dataFetcher = new DataFetcher();
try {
String combinedData = dataFetcher.fetchDataFromSystems();
System.out.println(combinedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}