ryoakg
2/10/2016 - 4:39 AM

jdbc.clj

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