1

我开始使用带有mongodb(带有 monger 库)的Clojure luminus 框架进行开发。很难理解如何实现库来启动数据库连接。mount

我发现代码应该放handler.clj'sinit函数。

但我不知道如何告诉 mount 启动数据库连接。

请你帮我一把好吗?

这里是我的开发 config.clj

    (ns vippro.config
  (:require [selmer.parser :as parser]
            [clojure.tools.logging :as log]
            [vippro.dev-middleware :refer [wrap-dev]]
))

(def defaults
  {:init
   (fn []
     (parser/cache-off!)
     (log/info "\n-=[vippro started successfully using the development profile]=-"))
   :middleware wrap-dev})

和 inhandler.cljinit函数

(defn init
  "init will be called once when
   app is deployed as a servlet on
   an app server such as Tomcat
   put any initialization code here"
  []
  (when-let [config (:log-config env)]
    (org.apache.log4j.PropertyConfigurator/configure config))
  (doseq [component (:started (mount/start))]
    (log/info component "started"))
  ((:init defaults)))

我的主要问题是我应该如何以init正确的方式调用这个函数

(defn connect! []
  ;; Tries to get the Mongo URI from the environment variable
  (reset! db (-> (:database-url env) mg/connect-via-uri :db)))
4

2 回答 2

1

设置环境变量时mongodb数据库自动启动

export DATABASE_URL="mongodb://127.0.0.1/dbname"

然后我启动了环服务器

于 2016-01-06T05:34:32.210 回答
1

您最初的问题是关于如何使用mount来执行此操作。

尽管您的 mongodb 客户端正在初始化,但我怀疑它在命名空间加载时正在执行此操作。

您定义了一个connect!函数,该函数将值连接并放入 atomdb中。这不是管理状态的正确方法,mount因为您使用自己的原子来存储状态。相反,尝试使用mount.core/defstate来创建和销毁 mongo 客户端:

(defstate settings
  :start {:mongo-uri "mongodb://localhost/my-database"})

(defn- mongo-connect
  [{:keys [mongo-uri]}]
  (mg/connect-via-uri mongo-uri))

(defn- mongo-disconnect
  [{:keys [conn] :as mongo-client}]
  (mg/disconnect conn))

(defstate mongo-client
  :start (mongo-connect settings)
  :stop (mongo-disconnect mongo-client))

(defn db [] (:db mongo-client))

通过这样做,您可以获得mount.

然后你可以使用environ/env你的settingsexport MONGO_URI="mongodb://..."

于 2018-01-14T01:03:55.287 回答