我正在学习 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))