簡體   English   中英

重用mongodb連接並關閉它

[英]reuse mongodb connection and close it

我在應用程序中使用Node本機客戶端1.4,並且在文檔中發現了一些令人困惑的地方:

連接池是由驅動程序維護的數據庫連接的緩存,以便在需要與數據庫的新連接時可以重新使用連接。 為了減少您的應用程序創建的連接池的數量,我們建議一次調用MongoClient.connect並重用回調返回的數據庫變量:

閱讀本文時會想到幾個問題:

  1. 這是否意味着db對象還維護副本集提供的故障轉移功能? 我認為應該是MongoClient的工作(對此不確定(但不確定),但C#驅動程序文檔確實說MongoClient維護着副本集的東西)
  2. 如果我正在重用db對象,應該何時調用db.close()函數? 我在每個示例中都看到了db.close() 但是,如果要重用它,我們不應該保持它開放嗎?

編輯 :因為這是關於重用的主題,我也想知道我們如何在不同的函數/對象中共享數據庫?
隨着項目的擴大,我不想將所有功能/對象嵌套在一個大的封閉中,但是我也不想將其傳遞給所有功能/對象。
在應用程序之間共享它的更優雅的方法是什么?

用於數據庫連接的“連接池”的概念已經存在了一段時間。 這確實是一種常識性方法,因為當您考慮時,每次希望發出查詢時都要建立與數據庫的連接是非常昂貴的,並且您不希望這樣做而要涉及額外的開銷。

因此,一般的原則是,您有一個對象句柄(在這種情況下為db引用),該對象句柄實際上會去檢查它可以使用哪個“池”連接,並可能是否充分利用了當前的“池”,然后創建另一個(或其他一些連接)以達到池限制,以處理請求。

MongoClient類本身只是一個構造函數或“工廠”類型類,其目的是建立連接以及實際上是建立連接池,並將句柄返回數據庫以供以后使用。 因此,實際上是在這里創建的連接被管理,以進行諸如副本集故障轉移之類的操作,或者可能從可用實例中選擇另一個路由器實例,並通常處理連接。

這樣,“長壽命”應用程序中的常規做法是“句柄”是全局可用的,或者可以從實例管理器中檢索以提供對可用連接的訪問​​。 這避免了在代碼的其他位置“建立”新連接的需要,該連接已被聲明為昂貴的操作。

您提到了“示例”代碼,該代碼通常在許多這樣的驅動程序實現手冊中經常出現,或者經常調用db.close 但是這些僅是示例,並非旨在作為長期運行的應用程序使用,因此,這些示例往往是“循環完成的”,因為它們顯示了所有“初始化”,各種方法的“使用”以及最后的“清理”隨着應用程序退出。

良好的應用程序或ODM類型的實現通常可以使用一種方法來建立連接,共享池,然后在應用程序最終退出時正常地進行清理。 您可能像編寫小型腳本的“手冊頁”示例一樣編寫代碼,但是對於大型的長期運行的應用程序,您可能要實現代碼以在實際應用程序退出時“清理”連接。

暫無
暫無

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

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