2015-05-04 7 views
5

Sprawdzam, czy YeSQL może pomóc w moim projekcie Clojure, ale nie mogę znaleźć żadnego przykładu YeSQL przy użyciu puli połączeń.YeSQL z pulą połączeń?

Czy oznacza to, że YeSQL tworzy nowe połączenie z każdym wyciągiem?

Znalazłem również przykład wykorzystania transakcji przy użyciu clojure.java.jdbc/with-db-transaction, ale uważam, że jest nieaktualny (jeszcze nie próbowałem).

Czy to oznacza, że ​​YeSQL zależy od clojure.java.jdbc, aby zatwierdzić/wycofać kontrolę? w takim przypadku, czy nie powinienem używać samego clojure.java.jdbc, ponieważ YeSQL nie oferuje zbyt wiele więcej (poza nazywaniem moich zapytań i ich uzewnętrznianie)?

góry dzięki

Odpowiedz

3

YeSQL nie obsługuje połączeń lub puli połączeń. Musisz to zrobić zewnętrznie i dostarczyć instancję połączenia do funkcji zapytania.

Jak widać z YeSQL przykład z README:

; Define a database connection spec. (This is standard clojure.java.jdbc.) 
(def db-spec {:classname "org.postgresql.Driver" 
       :subprotocol "postgresql" 
       :subname "//localhost:5432/demo" 
       :user "me"}) 

; Use it standalone. Note that the first argument is the db-spec. 
(users-by-country db-spec "GB") 
;=> ({:count 58}) 

; Use it in a clojure.java.jdbc transaction. 
(require '[clojure.java.jdbc :as jdbc]) 
(jdbc/with-db-transaction [connection db-spec] 
    {:limeys (users-by-country connection "GB") 
    :yanks (users-by-country connection "US")}) 

Jeśli zapytać, jak dodać obsługę puli połączeń można sprawdzić przykład z Clojure Cookbook.

chodzi o obsługę transakcji, dokumentacja YeSQL jest żaden, ale source jest dość łatwy do zrozumienia:

(defn- emit-query-fn 
    "Emit function to run a query. 
    - If the query name ends in `!` it will call `clojure.java.jdbc/execute!`, 
    - If the query name ends in `<!` it will call `clojure.java.jdbc/insert!`, 
    - otherwise `clojure.java.jdbc/query` will be used." 
    [{:keys [name docstring statement]}] 
    (let [split-query (split-at-parameters statement) 
     {:keys [query-args display-args function-args]} (split-query->args split-query) 
     jdbc-fn (cond 
       (= [\< \!] (take-last 2 name)) `insert-handler 
       (= \! (last name)) `execute-handler 
       :else `jdbc/query)] 
    `(def ~(fn-symbol (symbol name) docstring statement display-args) 
     (fn [db# [email protected]] 
     (~jdbc-fn db# 
        (reassemble-query '~split-query 
            ~query-args)))))) 

Tak będzie tylko generować funkcję, która będzie albo zadzwonić clojure.java.jdbc/execute! lub clojure.java.jdbc/insert! z wygenerowanego zapytania. Konieczne może być odszukanie dokumentacji tych funkcji w celu uzyskania dalszych szczegółów.

+0

Myślę, że jest to część problemu ... nie widzę, jak yesql może kwerendy, ale tylko wykonać jeden. – joefromct

+0

Tak, YeSQL to tylko biblioteka do eksternalizacji kodu SQL i generowania funkcji wykonawczych do jego wykonania. Używa 'clojure.java.jdbc' do wykonywania zapytań i instrukcji. –

+0

Nie jestem pewien, co masz na myśli, mówiąc: "Nie widzę, jak yesql może generować zapytanie, ale wykonywać je tylko jeden raz" - YeSQL nie musi generować żadnych zapytań SQL, gdy piszesz je samodzielnie w plikach SQL. YeSQL po prostu wygeneruje przydatne funkcje do wykonywania kodu SQL z tych plików jako zwykłych funkcji Clojure. –

2

Podczas wykonywania transakcji za pomocą YesQL, zawijam wywołania YesQL w wywołaniu clojure.java.jdbc/with-db-transation i przekazuję wygenerowane szczegóły połączenia do wywołania funkcji YesQL, które będą używane zamiast standardowe połączenie nietransakcyjne, jeśli jest dostarczane. Na przykład:

;; supply a name for the transaction connection, t-con, based on the existing db connection 
(jdbc/with-db-transaction [t-con db-spec] 
    ;; this is the yesql call with a second map specifying the transaction connection 
    (create-client-order<! {...} {:connection t-con})) 

wszystko opakowane rozmowy YesQL Używanie mapy {:connection t-con} będzie częścią tej samej transakcji.

Powiązane problemy