Я создаю агента для записи изменений обратно в базу данных (как описано в журнале с записью на основе агента в Clojure Programming).Определение агента lazily
Это прекрасно работает, но я изо всех сил пытаюсь создать агента поздно. Я не хочу создавать его как def, так как я не хочу, чтобы он создавался при выполнении моих тестов (я вижу, что пул запускается, когда тесты загружают формы, хотя я использую с redefs для установки тестового значения).
кода я начал есть (с использованием C3P0 пулов):
(def dba (agent (pool/make-datasource-spec (u/load-config "db.edn"))))
Я попытался сделать с агентом ноль, и исследовал, как я мог установить его в основном из моего приложения, когда это действительно необходимо. Но, похоже, нет эквивалентной функции reset!
, так как есть с атомом. А следующий код также не говорил агент не был ошибкой, так не нуждается в перезагрузке:
(when (not @dba)
(restart-agent dba (create-db-pool)))
Так что в данный момент у меня есть атом, содержащий агент, где я тогда делать:
(def dba (atom nil))
;; ...
(defn init-db! []
(when (not @dba)
(log/info "Creating agent for pooled connection")
(reset! dba (agent (create-db-pool))))
Но сам факт, который я должен сделать @@dba
, чтобы ссылаться на содержимое агента (т. Е. Пул), заставляет меня думать, что это безумие.
Есть ли более очевидный способ создания пула агента лениво?
Это интересно, но все же требуется двойное разыменование для доступа к элементу, например. '(def a (delay (агент 0))), а затем' @a => # <Агент @ 14c657f9: 0> 'и' @@ a => 0'. Это нормально? Я не думаю, что когда-либо видел, что @ @ 'используется в чей-то код, который я просматривал, поэтому мне кажется, что я упускаю трюк. Однако это уменьшает мой код от необходимости явной проверки/сброса !, поэтому лучше в этом отношении. –