gpt4 book ai didi

clojure - YeSQL 有连接池吗?

转载 作者:行者123 更新时间:2023-12-02 16:37:23 27 4
gpt4 key购买 nike

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

这是否意味着 YeSQL 会为每个语句创建一个新连接?

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

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

提前致谢

最佳答案

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

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

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

因此它只会生成一个函数,该函数将使用生成的查询调用 clojure.java.jdbc/execute!clojure.java.jdbc/insert! 。您可能需要参阅这些函数的文档以获取更多详细信息。

关于clojure - YeSQL 有连接池吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30036928/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com