使用monger时,我是否需要为每个请求提供连接?

时间:2013-07-30 15:17:32

标签: mongodb clojure monger

In the documentation,mongodb连接建立一次,在没有通过连接到每个命令的情况下使用之前,是使用monger的正确方法,还是应该将数据库连接传递给每个调用?

2 个答案:

答案 0 :(得分:2)

如果您使用单个数据库,那么最好设置一次连接:

(mg/connect! db-spec)

但是当你有多个数据库时,这不是一个好主意。对于这种情况,Monger有with-connection宏(see API docs):

(mg/with-connection db-connection
  ...)

您可以在应用初始化期间建立一次所有连接:

(def conn1 (mg/connect db-spec))

然后使用它们:

(mg/with-connection conn1
  ...)

更新。在我们的应用程序中,我们有一个所有数据库连接的哈希映射:

(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
  ...)

答案 1 :(得分:0)

现在(版本2.0)对于所有使用显式DB / connection / GridFS对象的关键公共API函数都是必需的。

这样:

(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"参考我的所有代码。