我有一个副本集,我想建立一个与从属实例的独立只读连接。
通常情况下,我应该没有遇到任何问题。我唯一应该做的就是设置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)
答案 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")