2017-04-06 25 views
0

我的應用程序需要訪問一個Mongo數據庫,如果多個進程/線程正在從一個特定的集合中讀取數據,就會發生不好的事情。如何在MongoDB上放置讀鎖定?

我需要限制一組進程從集合(或db,如果需要的話)讀取的能力。例如,如果有多個進程試圖從db中讀取,它們將按順序讀取,並行地讀取而不是

+0

如果從一個集合中讀取多個進程,會發生不好的事情?這聽起來像是一種不尋常的情況,你能告訴我們更多嗎? –

+0

@VinceBowdren是的。集合中的文檔確定要放入集合中的下一個文檔。集合中不得有重複項。因此,如果兩個進程同時從集合中讀取數據,他們可以讀取相同的數據,計算相同的下一個文檔,然後寫入相同的文檔,這對我的算法不利。 – user3919624

回答

1

這可以在驅動程序級別完成。如果將連接池大小設置爲1,則對數據庫的所有訪問都將按順序進行。

在你的NodeJS可以設置驅動程序:

MongoClient.connect(url, { 
    poolSize: 1 
}); 

從文檔:

poolSize,這可以讓你控制多少TCP連接 並行打開。默認值爲5,但您可以根據需要將其設置爲 。驅動程序將使用循環策略來調度 並從tcp連接中讀取。

+0

即使多個'MongoClient'實例在不同的進程中啓動,這是否也能工作?例如,如果兩個進程都運行'MongoClient.connect(url,{poolSize:1});',數據庫是否仍然接受來自TWO進程的連接? @kozakvoj – user3919624

+0

不,但如果您確實需要順序訪問數據庫(並且@VinceBowdren提到的情況非常特殊),則可以使用消息隊列。您的線程可以將數據庫讀取委託給隊列,當隊列完成時(異步地)將會通知他們。 – kozakvoj