文章目錄
- 場景描述
- 優化思路
- 分享資源
場景描述
接口需要從系統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();}}
}