clojure.contrib.sql и REPL взаимодействие - PullRequest
4 голосов
/ 31 марта 2011

У нас есть веб-приложение Clojure, которое использует jndi для создания соединения с базой данных.Код для запроса к базе данных выглядит примерно так:

(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.Однако это не работает в REPL, что делает разработку несколько непрактичной.

Есть ли способ структурировать код так, чтобы, когда он не запущен на сервере, конфигурация БД загружалась из файла конфигурации, а не из-за молнии?.xml, когда jndi-контекст недоступен?

1 Ответ

2 голосов
/ 31 марта 2011

Проблема в том, что ваш способ подключения к базе данных не всегда будет, хотя JNDI;например, при тестировании или в REPL вы можете захотеть управлять своим собственным пулом соединений.

Я предлагаю вам сохранить вашу спецификацию базы данных как var .Таким образом, единственное изменение в вашем коде - это переименование переменной;поскольку вы намереваетесь перепривязать , обычно используются звездочки:

(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 просто создайте свой собственный источник данных с помощью, скажем, Commons-DBCP и rebindваши спецификации БД к этому.

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

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