clojure.contrib.sql和REPL交互

时间:2011-03-30 21:29:33

标签: sql clojure jndi read-eval-print-loop

我们有一个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)))))

当铺设jetty时,会从jetty.xml文件加载jndi配置。然而,它在REPL中不起作用,使得开发有点不切实际。

有没有办法构造代码,以便在没有在服务器上运行时,如果没有jndi上下文可用,则从配置文件而不是jetty.xml加载db config?

1 个答案:

答案 0 :(得分:2)

问题是,你连接到数据库的方式并不总是通过JNDI;例如,在测试时或在REPL上,您可能想要管理自己的连接池。

我建议你将db规范保持为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上进行测试时,只需使用Commons-DBCP创建自己的数据源,然后重新绑定数据库规范。

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

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