2011-03-30 87 views
4

我們有一個使用JNDI來建立與數據庫的連接Clojure的web應用程序。查詢數據庫的代碼看起來是這樣的:clojure.contrib.sql和REPL交互

(def jndi-name {:name "jndi name"}) 

(defn query [q] 
    (sql/with-connection {:name "jndi name"} 
    (sql/with-query-results rs q 
     (time (vec rs))))) 

JNDI的配置是從的jetty.xml文件加載時Jetty是lauched。然而,它在REPL中不起作用,使得開發有些不切實際。

有沒有什麼辦法,以便當在服務器沒有運行,數據庫配置從一個配置文件,而不是的jetty.xml加載時沒有JNDI上下文可用來構造的代碼?

回答

2

的問題是,你的連接數據庫不會永遠是雖然JNDI的方式;例如,在測試或REPL時,您可能需要管理自己的連接池。

我建議你保持你的分貝規格爲var。因此,對代碼的唯一更改是重命名變量;因爲你打算rebind它,它通常使用星號:

(def *db-spec* {:name "jndi name"}) 

(defn query [q] 
    (sql/with-connection *db-spec* 
    (sql/with-query-results rs q 
     (time (vec rs))))) 

(query "select * from Students") 

而且在REPL測試時,只需創建,比如說自己的數據源,共享-DBCP和重新綁定你的數據庫規範了這一點。

(def ds (doto (BasicDataSource.) 
      (.setDriverClassName "oracle.jdbc.OracleDriver") 
      (.setUsername "tiger") 
      (.setPassword "scott"))) 

(binding [*db-spec* {:datasource ds}] 
    (query "select * from Students"))