gpt4 book ai didi

sql - clojure.contrib.sql 和 REPL 交互

转载 作者:行者123 更新时间:2023-12-01 04:12:17 25 4
gpt4 key购买 nike

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

jndi 配置是在 jetty 启动时从 jetty.xml 文件加载的。但是它在 REPL 中不起作用,使得开发有些不切实际。

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

最佳答案

问题是,您连接数据库的方式并不总是通过 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 上进行测试时,只需使用 Commons-DBCP 创建您自己的数据源,然后将您的数据库规范重新绑定(bind)到该数据源。
(def ds (doto (BasicDataSource.)
(.setDriverClassName "oracle.jdbc.OracleDriver")
(.setUsername "tiger")
(.setPassword "scott")))

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

关于sql - clojure.contrib.sql 和 REPL 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5492675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com