【问题标题】:clojure.contrib.sql and REPL interactionclojure.contrib.sql 和 REPL 交互
【发布时间】:2011-03-30 21:29:33
【问题描述】:

我们有一个 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 配置?

【问题讨论】:

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


    【解决方案1】:

    问题是,您连接数据库的方式并不总是通过 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 创建您自己的数据源,然后将您的数据库规范重新绑定到该数据源。

    (def ds (doto (BasicDataSource.)
              (.setDriverClassName "oracle.jdbc.OracleDriver")
              (.setUsername "tiger")
              (.setPassword "scott")))
    
    (binding [*db-spec* {:datasource ds}]
      (query "select * from Students"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2015-07-28
      相关资源
      最近更新 更多