所以我有 4 個從 DB2 獲取資料的 java 方法,我已經評論了從 DB2 獲取結果所需的相應時間:
db2.fetchCigarProducts(id) // time taken 625 ms
db2.fetchPowderProdcuts(id) // time taken 327 ms
db2.fetchLegacyCigars(id) // time taken 314 ms
db2.fetchDairyProduct(id) // time taken 443 ms
顯然,所花費的時間會根據作為輸入(引數)給出的 id 而有所不同,但這是大多數呼叫的平均時間。
這是代碼的結構方式,呼叫 Function 的偽代碼:
for(String itemId: combinedItemIds) {
fetchAndProcessDataFromDB2(itemId);
}
public void fetchAndProcessDataFromDB2(itemId) {
db2.fetchCigarProducts(id) // time taken 625 ms
db2.fetchPowderProdcuts(id) // time taken 327 ms
db2.fetchLegacyCigars(id) // time taken 314 ms
db2.fetchDairyProduct(id) // time taken 443 ms
}
現在在上述正常流程中(沒有任何多執行緒),每個 itemId 的 fetchAndProcessDataFromDB2 時間約為 1500 ms ~= 1.5 秒。
因此,為了并行處理這 4 種方法以節省時間,我將這 4 種方法同步,并嘗試按以下方式使用 exectorService:
public void fetchAndProcessDataFromDB2(itemId) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(
() -> { db2.fetchCigarProducts(id); }
);
executorService.execute(
() -> { db2.fetchPowderProdcuts(id); }
);
executorService.execute(
() -> { db2.fetchLegacyCigars(id); }
);
executorService.execute(
() -> { db2.fetchDairyProduct(id); }
);
executorService.shutdown();
executorService.awaitTermination(5, TimeUnit.SECONDS);
}
我預計上述方法中有 4 種將并行執行,并且預計總共需要 400-500 毫秒的粗略時間。但令我驚訝的是,使用 executorService 的 fetchAndProcessDataFromDB2 所用的總時間約為 1.7 秒,比沒有多執行緒的 fetchAndProcessDataFromDB2 方法多一點。
有人可以幫我理解為什么會這樣嗎?任何提示/指標表示贊賞。
uj5u.com熱心網友回復:
有人可以幫我理解為什么會這樣嗎?任何提示/指標表示贊賞。謝謝
您的代碼看起來正確,所以我懷疑db2物件中的某些東西正在序列化資料庫操作,或者服務器可能無法更快地同時執行 4 個查詢。
更具體地說,該db2物件可能有一個用于與資料庫對話的資料庫連接。它可能會在 fetch 呼叫中鎖定連接,因此即使有多個執行緒在呼叫fetch...(),但實際上只有 1 個執行緒同時在作業。
就資料庫而言,每個fetch...操作都可能導致對大表進行某種表掃描。同時運行多個它們不一定會導致提取運行得更快,甚至可能導致底層存盤機制運行得更慢,因為它必須在并發操作期間從 4 個不同的位置讀取。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520387.html
