7
votes

Quelle est la bonne façon de stocker une connexion globale dans le clojure?

J'ai le fichier suivant qui agit comme point d'accès à ma DB de mes points d'extrémité d'API. Quelle est la bonne façon de maintenir une seule connexion (ou un pool de connexion?) Pour la durée de vie du serveur?

(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
      )))


0 commentaires

4 Réponses :


5
votes

Le base de données_url code> est stocké, si vous utilisez avec connexion code> macro pour une connexion unique. Vous pouvez utiliser bibliothèque C3P0 pour le pool de connexion:

(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}))


0 commentaires

3
votes

Je recommande également C3P0. Connexion de clojure Piscuting Fournit une introduction succincte sur la configuration de clojure.java.jdbc avec C3P0.


0 commentaires

0
votes

Je ne pense pas avec la connexion qui ne peut rien ouvrir. Doc ni source le suggère et, en 2.3, j'ai pu le confirmer en inspectant dB em> après avoir exécuté les requêtes. La source ressemble à ceci:

(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})


0 commentaires

2
votes

JDBC-Pool simplifie le processus d'utilisation de C3P0 avec clojure.java.jdbc. J'ai créé la bibliothèque spécifiquement (et seulement) à cette fin.


0 commentaires