带有连接池的YeSQL?

时间:2015-05-04 18:08:05

标签: clojure

我正在检查YeSQL是否可以帮助我的Clojure项目,但我找不到任何使用连接池的YeSQL示例。

这是否意味着YeSQL创建了与每个​​语句的新连接?

我还找到了一个关于如何使用clojure.java.jdbc / with-db-transaction来使用事务的例子,但我觉得它已经过时了(我还没有尝试过)。

这是否意味着YeSQL依赖clojure.java.jdbc来提交/回滚控制?在这种情况下,我不应该单独使用clojure.java.jdbc,因为YeSQL不提供太多(除了命名我的查询并将其外化)?

提前致谢

1 个答案:

答案 0 :(得分:3)

YeSQL不处理连接或连接池。您需要在外部处理它并为查询函数提供连接实例。

正如您从README中的YeSQL示例中所看到的那样:

(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# ~@function-args]
         (~jdbc-fn db#
                   (reassemble-query '~split-query
                                     ~query-args))))))

如果您询问如何添加连接池处理,可以查看Clojure Cookbook中的示例。

至于事务处理,YeSQL文档没有,但source很容易理解:

clojure.java.jdbc/execute!

因此它只会生成一个函数,该函数将使用生成的查询调用clojure.java.jdbc/insert! var file = $('#file').get(0).files[0], fsFile = new FS.File(file), productData = { title:$('#title').val(), price:$('#price').val(), category:$('#category').val() } Products.insert(productData,function(err,result){ if(!err){ fsFile.metadata = { productId:result, //we use metadata to refer the recent object id with the product images } productImages.insert(fsFile,function(err,result){ if(!err){ console.log("New images inserted") } }); } }); 。您可能需要参考这些函数的文档以获取更多详细信息。