2012-07-20 8 views
5

Tengo el siguiente archivo que actúa como punto de acceso a mi base de datos desde mis puntos finales API. ¿Cuál es la forma correcta de mantener una conexión única (o un grupo de conexiones) durante la vida útil del servidor?¿Cuál es la forma correcta de almacenar una conexión global en Clojure?

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

Respuesta

4

la DATABASE_URL se almacena, si utiliza with-connection macro para la conexión individual. puede utilizar c3p0 biblioteca de agrupación de conexiones:

(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

No creo que la conexión tenga nada abierto. Doc ni fuente lo sugieren, y en 2.3 pude confirmarlo inspeccionando db después de ejecutar consultas. La fuente es el siguiente:

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

La agrupación de conexiones puede ser útil en la creación de pereza, pero eso no se sostiene abiertos. Hacer la conexión configurable parece ser necesaria. Sin embargo, la API más reciente enfatiza la creación de la conexión y su transferencia a cada llamada. Mientras todavía ALPHA, parece el futuro de esta biblioteca (y aún es compatible con la agrupación de conexiones). A partir de la biblioteca de wiki:

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

jdbc-pool simplifica el proceso de utilización de C3P0 con clojure.java.jdbc. Creé la biblioteca específicamente (y solo) para este propósito.

Cuestiones relacionadas