我们有一个Clojure Web应用程序,它使用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被推出时,jndi配置从jetty.xml文件加载.然而,它在REPL中不起作用,使得开发有些不切实际.
是否有任何方法来构造代码,以便在不在服务器上运行时,在没有jndi上下文可用时,从配置文件而不是jetty.xml加载db config?
最佳答案 问题是,你连接到数据库的方式并不总是通过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创建自己的数据源,然后将db规范重新绑定.
(def ds (doto (BasicDataSource.)
(.setDriverClassName "oracle.jdbc.OracleDriver")
(.setUsername "tiger")
(.setPassword "scott")))
(binding [*db-spec* {:datasource ds}]
(query "select * from Students"))