2

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

通常,我应该不会遇到任何问题。我唯一应该做的就是设置slaveOk=true能够通过读取操作来查询它。当我使用nodejs或 mongo 控制台时它工作得很好,但我发现没有办法使用monger.

最奇怪的是,当我调用set-db!函数时出现异常:

MongoException 不与 master 交谈并重试用完 com.mongodb.DBTCPConnector.innerCall (DBTCPConnector.java:314)

建立副本集连接对我来说不是一个选项。

目前我正在使用[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)

4

2 回答 2

1

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

因此,正确的解决方案是使用setReadPreference方法将ReadPreference设置为辅助,然后使用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!宏连接到从属实例。

于 2013-01-18T15:46:39.257 回答
1

我在 monger 2.0.0 下也发现了以下作品:

(connect-via-uri "mongodb://host/db?readOnly=true&readPreference=secondary")
于 2014-12-03T16:46:03.073 回答