2013-01-18 38 views
2

我有一個副本集,我想建立一個獨立的只讀連接到一個從實例。使用monger的只讀連接到從實例

通常,我應該沒有問題。我應該做的唯一事情是設置slaveOk=true能夠通過讀取操作來查詢它。當我使用nodejs或mongo控制檯時,它效果很好,但是我發現無法使用monger來完成它。

最奇怪的是,我收到的時候我打電話set-db!功能異常:

MongoException不是說要掌握和重用完 com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java :314)

建立replica-set connection不適合我。

當前我正在使用[com.novemberain/monger "1.4.0"]

謝謝!


更新:我通過Java MongoDB Driver API Documentation看了一下,發現slaveOk方法。我寫了下面的代碼,希望它會工作:

(defn slave-connect! 
    [& args] 
    (mg/set-connection! 
    (doto (apply mg/connect args) 
      (.slaveOk)))) 

但是,所有我所得到的是一個新的異常:

MongoException沒有掌握com.mongodb.CommandResult.getException (CommandResult。 java:100)

回答

1

看起來我用com.mongodb.DBApiLayer Documentation解決了我的問題。

所以,正確的解決方案是使用setReadPreference方法設置ReadPreferencesecondary,然後使數據庫只讀使用setReadOnly()方法:

(import 'com.mongodb.ReadPreference) 

(defn use-slave-db! 
    [& args] 
    (mg/set-db! 
    (doto (apply mg/get-db args) 
      (.setReadOnly true) 
      (.setReadPreference 
      (ReadPreference/secondary))))) 

現在磨片能夠連接到使用use-slave-db!從實例函數而不是默認的use-db!宏。

1

我發現了以下工作得下販子2.0.0:

(connect-via-uri "mongodb://host/db?readOnly=true&readPreference=secondary") 
+0

良好的漁獲!儘管使用連接字符串似乎不是實現此功能的正確方法。 –