我有以下文件作为我的数据库端点的数据库访问点。在服务器生命周期内维护单个连接(或连接池?)的正确方法是什么?
(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
)))
答案 0 :(得分:4)
如果您使用DATABASE_URL
宏进行单一连接,则会存储with-connection
。您可以将c3p0库用于连接池:
(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}))
答案 1 :(得分:2)
我也推荐c3p0。
Clojure connection pooling
简要介绍了如何使用c3p0配置clojure.java.jdbc
。
答案 2 :(得分:1)
jdbc-pool简化了将C3P0与clojure.java.jdbc一起使用的过程。我为此专门(并且仅)创建了库。
答案 3 :(得分:0)
我不认为连接会保持任何开放状态。 Doc和Source建议,在2.3中我能够通过在运行查询后检查 db 来确认它。来源如下:
(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))))
连接池在延迟创建它们时可能很有用,但这并不能使它们保持打开状态。使连接可设置似乎是必要的。但是,最新的API强调只创建连接并将其传递给每个调用。虽然仍然是ALPHA,但这看起来像这个库的未来(并且仍然与连接池兼容)。来自图书馆的维基:
(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})