1

我正在学习 Clojure (1.10),并正在使用 Luminus 框架 (3.93) 编写一个小型 Web 应用程序,使用 Monger 客户端 (3.1.0) 连接到 MongoDB 实例。Luminus 生成一些脚手架代码,用于在启动时创建数据库连接池(使用函数monger.core/connect-via-uri<myproject>.db.core

(ns myproject.db.core
  (:require [monger.core :as mg] ... ))

(defstate db*
  :start (-> env :database-url mg/connect-via-uri)
  :stop (-> db* :conn mg/disconnect))

...

我的问题:如果此时 MongoDB 实例不可用,则不会显示任何警告问题的信息。提供网页,直到需要调用 Monger 函数。此时,应用程序“搅动”,然后超时(设置为 30 秒)并出现异常/堆栈跟踪错误屏幕(除了可怕的用户体验之外,还可能暴露本应保密的代码/数据)。

当必备数据库不可用时,如何最好地防止启动应用程序?

一种(诚然笨拙的)初始尝试是将 Monger 调用插入到上述启动代码中。这会在启动期间导致超时异常(带有异常消息),而不是启动 Web 应用程序。有什么更好的方法?

另外,您是否知道一种方法可以让此类问题停止启动过程,而不是重试并大量输出失败消息?

(defstate db*
  :start (-> env :database-url mg/connect-via-uri
             ; clumsy way to catch timeouts due to no database when starting up:
             (#(mg/get-db-names (:conn %)) %))
  :stop (-> db* :conn mg/disconnect))
4

2 回答 2

0

我不是 Monger 方面的专家,但他们网站上的本指南显示了更改超时的方法。

所以,也许将超时更改为 3 秒或其他什么,然后看看你可以连接。否则,抛出异常或其他东西。

于 2021-03-20T16:24:30.760 回答
0

您可以尝试ping数据库以检查其可用性:

(mg/command db {:ping 1})

此外,您可以创建一个调度程序(例如这里的this)来定期检查数据库的状态

于 2021-03-25T08:48:43.063 回答