(require '[clojure.pprint :refer :all]
'[jdbc.core :as jdbc]) ;http://funcool.github.io/clojure.jdbc/latest/api/jdbc.core.html
(import '(com.mchange.v2.c3p0 ComboPooledDataSource))
(def db-spec {:classname "org.postgresql.Driver",
:subprotocol "postgresql",
:subname "//localhost:5432/foo",})
(defn make-pool
[spec]
(let [cpds (doto (ComboPooledDataSource.)
(.setDriverClass (:classname spec))
(.setJdbcUrl (str "jdbc:" (:subprotocol spec) ":" (:subname spec)))
;; (.setUser (:user spec))
;; (.setPassword (:password spec))
;; expire excess connections after 30 minutes of inactivity:
(.setMaxIdleTimeExcessConnections (* 30 60))
;; expire connections after 3 hours of inactivity:
(.setMaxIdleTime (* 3 60 60)))]
{:datasource cpds}))
(with-open [conn (jdbc/connection db-spec)]
(jdbc/fetch conn "SELECT * FROM bar"))
(with-open [conn (jdbc/connection db-spec)]
(-> (jdbc/fetch-lazy conn "SELECT * FROM bar")
jdbc/cursor->lazyseq
pprint))
;;; error
(-> (with-open [conn (jdbc/connection db-spec)]
(jdbc/fetch-lazy conn "SELECT * FROM bar"))
jdbc/cursor->lazyseq
pprint)
;;; OK
(def the-pool (make-pool db-spec))
(->> (jdbc/fetch-lazy the-pool "SELECT * FROM bar")
jdbc/cursor->lazyseq
(take 2)
pprint)