7

我有以下文件作为从我的 API 端点访问我的数据库的访问点。在服务器的生命周期内维护单个连接(或连接池?)的正确方法是什么?

(ns my-api.repository
  (:require [clojure.java.jdbc :as sql]))

(defn some-query
  (sql/with-connection (System/getenv "DATABASE_URL")
    (sql/with-query-results results
      ;; You get the picture
      )))
4

4 回答 4

5

DATABASE_URL如果您使用with-connection宏进行单次连接,则会存储。您可以将c3p0库用于连接池:

(defn pooled-spec
  "return pooled conn spec.
   Usage:
     (def pooled-db (pooled-spec db-spec))
     (with-connection pooled-db ...)"
  [{:keys [classname subprotocol subname user password] :as other-spec}]
  (let [cpds (doto (ComboPooledDataSource.)
               (.setDriverClass classname)
               (.setJdbcUrl (str "jdbc:" subprotocol ":" subname))
               (.setUser user)
               (.setPassword password))]
    {:datasource cpds}))
于 2012-07-20T01:00:19.583 回答
3

我也推荐c3p0。 Clojure 连接池 简要介绍了如何clojure.java.jdbc使用 c3p0 进行配置。

于 2012-07-21T14:39:20.087 回答
2

jdbc-pool简化了将 C3P0 与 clojure.java.jdbc 一起使用的过程。我专门(且仅)为此目的创建了该库。

于 2013-07-27T17:41:14.363 回答
0

我不认为 with-connection 保持开放。Doc 或 source 建议它,在 2.3 中,我能够通过在运行查询后检查db来确认它。源代码如下所示:

(defn with-connection*
  "Evaluates func in the context of a new connection to a database then
  closes the connection."
  [db-spec func]
  (with-open [^java.sql.Connection con (get-connection db-spec)]
    (binding [*db* (assoc *db* :connection con :level 0 :rollback (atom false))]
      (func))))

连接池在懒惰地创建它们时可能很有用,但这并不能使它们保持打开状态。使连接可设置似乎是必要的。然而,最新的 API 强调只是创建连接并将其传递给每个调用。虽然仍然是 ALPHA,但这看起来像是这个库的未来(并且仍然与连接池兼容)。从图书馆的维基:

(require '[clojure.java.jdbc :as j]
     '[clojure.java.jdbc.sql :as s])

(def mysql-db {:subprotocol "mysql"
               :subname "//127.0.0.1:3306/clojure_test"
               :user "clojure_test"
               :password "clojure_test"})

(j/insert! mysql-db :fruit
  {:name "Apple" :appearance "rosy" :cost 24}
  {:name "Orange" :appearance "round" :cost 49})
于 2013-05-30T03:34:45.337 回答