2011-03-30 10 views
4

우리는 jndi를 사용하여 데이터베이스에 연결하는 Clojure 웹 앱을 가지고 있습니다. 데이터베이스를 조회하는 코드는 다음과 같은 : 부두가 lauched 때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의 파일에서로드됩니다. 그러나 REPL에서 다소 비실용적 인 개발을하는 것은 효과가 없습니다.

코드를 구조화 할 수있는 방법이 없으므로 서버에서 실행되지 않을 때 jndi 컨텍스트를 사용할 수없는 경우 dbty 구성 파일을 dbty 구성 파일에서로드합니다.

답변

2

문제는 데이터베이스에 연결하는 방법이 항상 JNDI가 아니라는 것입니다. 예를 들어, 테스트 중이거나 REPL에서 직접 연결 풀을 관리하고자 할 수 있습니다.

db spec을 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를 작성하고 귀하의 DB 사양을 리 바인드.

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

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