使用monger与从属实例的只读连接

时间:2013-01-18 13:51:49

标签: mongodb clojure monger

我有一个副本集,我想建立一个与从属实例的独立只读连接。

通常情况下,我应该没有遇到任何问题。我唯一应该做的就是设置slaveOk=true以便能够使用读取操作进行查询。我使用nodejs或mongo控制台时效果很好,但我发现使用monger无法做到这一点。

最奇怪的是我在调用set-db!函数时遇到异常:

  

MongoException没有与master进行对话并且重试已用完   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)

2 个答案:

答案 0 :(得分:1)

看起来我使用com.mongodb.DBApiLayer Documentation解决了我的问题。

因此,正确的解决方案是使用ReadPreference方法将secondary设置为setReadPreference,然后使用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 :(得分:1)

我在monger 2.0.0下发现了以下工作:

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