2012-07-20 31 views
5

Tôi có tệp sau hoạt động như điểm truy cập đến DB của tôi từ các điểm cuối API của tôi. Cách thích hợp để duy trì một kết nối duy nhất (hoặc một hồ bơi kết nối?) Cho cuộc sống của máy chủ là gì?Cách thích hợp để lưu trữ kết nối toàn cầu trong Clojure là gì?

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

Trả lời

4

các DATABASE_URL được lưu trữ, nếu bạn sử dụng with-connection vĩ mô cho kết nối duy nhất. bạn có thể sử dụng thư viện c3p0 cho hồ bơi kết nối:

(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

Tôi cũng khuyên bạn nên dùng c3p0. Clojure connection pooling cung cấp giới thiệu ngắn gọn về cách định cấu hình clojure.java.jdbc với c3p0.

0

Tôi không nghĩ rằng kết nối có bất kỳ thứ gì đang mở. Tài liệu cũng như nguồn không đề xuất nó và trong 2.3 tôi đã có thể xác nhận nó bằng cách kiểm tra db sau khi chạy truy vấn. Nguồn trông giống như sau:

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

Kết nối tổng hợp có thể hữu ích trong việc tạo ra chúng một cách lười biếng nhưng không giữ chúng mở. Việc đặt kết nối có thể là cần thiết. Tuy nhiên, API mới nhất nhấn mạnh việc tạo kết nối và chuyển nó vào mỗi cuộc gọi. Trong khi vẫn còn ALPHA, điều này trông giống như tương lai cho thư viện này (và vẫn tương thích với kết nối tổng hợp). Từ wiki của thư viện:

(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 đơn giản hoá quá trình sử dụng C3P0 với clojure.java.jdbc. Tôi đã tạo thư viện cụ thể (và chỉ) cho mục đích này.

Các vấn đề liên quan