簡體   English   中英

通過並行加速mongo查詢並使用ThreadPool?

[英]Speed up mongo queries by parallel them and use a ThreadPool?

我們的mongodb架構每周存儲數據。 每周都有它自己的數據庫與相同的集合集。 有時我必須檢查數據超過12周,這意味着我在12個不同的數據庫(所有在一個mongo服務器上)運行相同的查詢:

...
for (MongoOperationDto week : allWeeks) {
  results.addAll(repo.find(gid, week.db(), week.collection());
}
...

在這種情況下,我按順序運行12次find()。 我猜內部連接池處理它們還是? 如果不是,如果我創建12個Java線程並且每個線程將運行一個查找,那么它會是一個好處嗎? 也許喜歡:

public class FindTask {

    @Autowired
    MyMongoRepo repo;

    @Async
    public List<Result> doFindTask(long gid, MongoOperationDto week) {
         return repo.find(gid, week.db(), week.connection());
    }
}

哪種方法實際上更快或者在檢索數據時沒有速度差異?

連接池處理連接,僅此而已:

在軟件工程中,連接池是維護的數據庫連接的緩存,以便在將來需要對數據庫的請求時可以重用連接

對於您的第一個代碼,這意味着在完成第一個查找而不是建立與MongoDB的新連接之后,它可以重用池中存在的現有已打開且未使用的連接。

因此,在第一種情況下,每個查詢將有12個串行查詢和1個連接。

在第二種情況下,您有12個並行查詢同時使用12個不同的連接。

在性能方面如果查詢需要很長時間,第二個解決方案應該更快(完成時間),但它使用更多資源(ram,cpu時間)。 請注意,時間也受MongoDB架構的影響。 如果您的查詢在同一磁盤上運行長磁盤操作,則可能並行化它們並不會改善總時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM