2016-03-30 12 views
0

我旁邊一些輔助函數定義的一個datomic連接值:刷新Clojure中的一個VAL

(def uri "datomic:dev://localhost:4334/dab") 

(defn delete-db [] (d/delete-database uri)) 
(defn create-db [] (d/create-database uri)) 

(def conn (d/connect uri)) 

的問題是,如果我叫刪除-DB,然後創建-DB中的「參數conn」的連接價值下降。所以我需要一種能夠在執行刪除/創建循環後'重新加載'conn值的方法。鑑於「def values」的不變本質,我該怎麼做?

我遇到了這個:http://www.rkn.io/2014/02/10/datomic-antipatterns-connnnn/它討論了不使用conn作爲一個值的原因,但它只有在進行查詢時纔有意義。我正在通過conn進行交易功能。

回答

2

我會建議兩種解決問題的方法:

  1. 簡單:換你連接到價值​​。它明確表示它可能會隨着時間而變化,併爲您提供明確定義的變化特徵。您可以公開一個乾淨的API函數,如open-conectionclose-connection,它們將操縱原子的狀態。

  2. 複雜:您可以使用處理運行時資源生命週期的庫/框架。最流行的(和非常正交的方法)是ComponentMount

您也可以使用alter-var-root但我會用它作爲最後的手段方法,並將其視爲黑客。