mongodb連接池

mongo實例其實已經是一個現成的連接池了,而且線程安全。這個內置的連接池默認初始了10個連接,每一個操作(增刪改查等)都會獲取一個連接,執行操作後釋放連接。

 

連接池的重要參數

內置連接池有多個重要參數,分別是:

  • connectionsPerHost:每個主機的連接數,默認是10

  • threadsAllowedToBlockForConnectionMultiplier:線程隊列數,它以上面 connectionsPerHost值相乘的結果就是線程隊列最大值。如果連接線程排滿了隊列就會拋出“Out of semaphores to get db”錯誤,默認是5

  • maxWaitTime:最大等待連接的線程阻塞時間

  • connectTimeout:連接超時的毫秒。0是默認和無限

  • socketTimeout:socket超時。0是默認和無限

  • autoConnectRetry:這個控制是否在一個連接時,系統會自動重試

其設置方式如下:

Server=127.0.0.1:27017;ConnectTimeout=500000;ConnectionLifetime=400000;

MinimumPoolSize=10;MaximumPoolSize=500;Pooled=true

 

這裏需要注意的是,連接字符串必段一樣的,否則會重新創建另外一個池 。(SQL/Mongodb 都是如此)。在串行過程中,使用同一連接字符串依次創建的連接在一般指向同一個連接(當沒有其它並行線程的情況下)。並行過程中,則表現爲池中 MinimumPoolSize循環利用。而不同的連接字符串創建連接必定都是新建立的不同連接,並且產生了新的池來控制。

可能大家覺得有池肯定好,但是池的MaximumPoolSize要有個合理值,否則這個值數據量的連接都被佔用,後面再有新的連接創建時就要等待了,而 不能超出池上限新建連接。除此之外還要設置合理的連接等待,連接超時時間,以防止一個連接佔用時間過長,影響其它連接請求。

官網介紹 每個Client to Server 的連接不能超過100個(開始誤以爲這個Client指的是一臺PC,但後面測試證實僅僅一個開啓的應用程序,即同一臺電腦開啓多個相同或不同的應用分別可以並行100個連接),通過測試證實單個應用程序最大並行連接數剛好是100個。但是單個應用程序最大並行連接數100並不是MaximumPoolSize的 合適值,因爲可能一臺PC有多個應用(假設10個應用),有多臺類似PC(假設1000)連接Server ,所以MaximumPoolSize就可能的是100*10*1000的並行連接數。所以要根據實現情況設置合理的MaximumPoolSize,以 及每個連接的等待,超時時間。 另外注意一點:單應程序做並行操作時,並行的連接不能超過100,雖然單客戶並行連接不能超過100,但是mongo是線程安全的,允許每個連接並行操作

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章