2012-07-20 14 views
5

मेरे पास निम्न फ़ाइल है जो मेरे डीपी को मेरे एपीआई एंडपॉइंट्स से एक्सेस पॉइंट के रूप में कार्य करती है। सर्वर के जीवन के लिए एकल कनेक्शन (या कनेक्शन पूल?) बनाए रखने का उचित तरीका क्या है?क्लोजर में वैश्विक कनेक्शन को स्टोर करने का उचित तरीका क्या है?

(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

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

मैं भी c3p0 सलाह देते हैं। Clojure connection pooling c3p0 के साथ clojure.java.jdbc को कॉन्फ़िगर करने के लिए एक संक्षिप्त परिचय प्रदान करता है।

0

मुझे नहीं लगता कि कनेक्शन के साथ कुछ भी खुला है। डॉक्टर और न ही स्रोत यह सुझाव देते हैं, और 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)))) 

कनेक्शन पूलिंग lazily उन्हें बनाने में उपयोगी हो सकता है, लेकिन है कि उन्हें खुला नहीं रखता है। कनेक्शन सेटटेबल बनाना आवश्यक प्रतीत होता है। हालांकि नवीनतम एपीआई सिर्फ कनेक्शन बनाने और प्रत्येक कॉल में इसे पारित करने पर जोर देती है। अभी भी अल्फा, यह इस पुस्तकालय के लिए भविष्य की तरह दिखता है (और कनेक्शन पूलिंग के साथ अभी भी संगत है)। पुस्तकालय का विकी से:

(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 clojure.java.jdbc साथ C3P0 उपयोग करने की प्रक्रिया सरल करता है। मैंने पुस्तकालय को विशेष रूप से (और केवल) इस उद्देश्य के लिए बनाया है।

संबंधित मुद्दे