7

API エンドポイントから DB へのアクセス ポイントとして機能する次のファイルがあります。サーバーの存続期間中、単一の接続 (または接続プール) を維持する適切な方法は何ですか?

(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使用する場合、これが保存されます。接続プールにc3p0with-connectionライブラリを使用できます。

(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 に答える
0

with-connection が何かを開いているとは思いません。ドキュメントもソースもそれを示唆していません.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 では、接続を作成して各呼び出しに渡すだけに重点が置かれています。まだアルファ版ですが、これはこのライブラリの将来のように見えます (そして接続プーリングとの互換性はまだあります)。図書館のウィキから:

(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 に答える