在文件中,mongodb连接在未将连接传递给每个命令之前只建立一次,这是使用monger的正确方式,还是应该将数据库连接传递给每个调用?
发布于 2013-07-30 15:38:57
如果您使用单个数据库,那么最好只设置一次连接:
(mg/connect! db-spec)但是,当您有多个数据库时,这不是一个好主意。在这种情况下,Monger拥有with-connection宏(见API文档):
(mg/with-connection db-connection
...)您可以在应用程序初始化期间建立所有连接一次:
(def conn1 (mg/connect db-spec))然后使用它们:
(mg/with-connection conn1
...)Update.在我们的应用程序中有一个包含所有数据库连接的哈希映射:
(def ^:dynamic
^clojure.lang.PersistentArrayMap
*connections*
{})
(defn connect! [db]
{:pre [(contains? mongo-config db)]}
(if (-> db *connections* nil?)
(let [conn (mg/connect (get mongo-config db))]
(alter-var-root #'*connections*
assoc
db
{ :conn conn
:db (mg/get-db conn (name db))})))
(-> *connections* db :conn))
(defmacro with-db [db & body]
"Eval body using :amonplus or :statistic db"
`(mg/with-connection (connect! ~db)
(mg/with-db (clojure.core/-> *connections* ~db :db)
~@body)))mongo-config变量为我们的所有数据库存储规范,with-db宏使按它们的名称访问它们变得非常容易:
(with-db :my-db
...)发布于 2014-07-17 01:01:59
现在(2.0版)对于所有关键的公共API函数使用一个显式DB/connection/GridFS对象是必要的。
因此:
(require '[monger.collection :as mc])
(mc/insert db "libraries" {:name "Monger"})为了得到这份工作:
(let [conn (mg/connect)
db (mg/get-db conn "monger-test")]
(mc/insert db "libraries" {:name "Monger"}))如何使用"db“引用跨越了我的所有代码。
https://stackoverflow.com/questions/17950969
复制相似问题