2015-05-04 2 views
5

Я проверяю, может ли YeSQL помочь в моем проекте Clojure, но я не могу найти какой-либо пример YeSQL, используя пул соединений.YeSQL с пулом соединений?

означает ли это, что YeSQL создает новое соединение с каждым утверждением?

Я также нашел пример того, как использовать транзакции, используя clojure.java.jdbc/with-db-transaction, но я считаю, что он устарел (я еще не пробовал).

означает ли это, что YeSQL зависит от clojure.java.jdbc для управления фиксацией/откатом? в этом случае, не следует ли мне просто использовать clojure.java.jdbc самостоятельно, так как YeSQL не предлагает слишком многого другого (кроме имен моих запросов и их экстернализации)?

заранее спасибо

ответ

3

YeSQL не обрабатывает соединения или пула соединений. Вам нужно обработать его извне и предоставить экземпляр соединения для функции запроса.

Как вы можете видеть из YeSQL, например, из 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")}) 

Если вы спросите, как добавить пул соединений обработки вы можете проверить пример из Clojure Cookbook.

Что касается обработки транзакций, YeSQL документации не имеется, но source довольно легко понять:

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

Так это будет просто сгенерировать функцию, которая будет либо вызывать clojure.java.jdbc/execute! или clojure.java.jdbc/insert! с сгенерированного запроса. Возможно, вам потребуется обратиться к документации этих функций для получения дополнительной информации.

+0

Я думаю, что это часть проблемы ... Я не вижу, как yesql может обрабатывать запрос, но только выполнить его. – joefromct

+0

Да, YeSQL - это просто библиотека для экстернализации кода SQL и создания функций выполнения для ее выполнения. Он использует 'clojure.java.jdbc' для выполнения запросов и операторов. –

+0

Я не уверен, что вы подразумеваете под «Я не вижу, как yesql может дать запрос, но только выполнить его» - YeSQL не нужно генерировать SQL-запросы, когда вы пишете их самостоятельно в файлах SQL. YeSQL будет генерировать удобные функции для выполнения SQL-кода из этих файлов в качестве обычных функций Clojure. –

2

При выполнении транзакций с использованием YesQL я завершаю вызовы YesQL в вызове clojure.java.jdbc/with-db-transation и передаю сгенерированную информацию о соединении в вызов функции YesQL, который они будут использовать вместо стандартное соединение без транзакции, если оно поставляется. Например:

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

Все завернутые вызовы YesQL с помощью {:connection t-con} карты будет частью той же сделки.

Смежные вопросы