Skip to content

Instantly share code, notes, and snippets.

@hdenk
Created August 21, 2011 15:37
Show Gist options
  • Save hdenk/1160756 to your computer and use it in GitHub Desktop.
Save hdenk/1160756 to your computer and use it in GitHub Desktop.
noir framework: a middleware for jdbc-connection-handling (using c3p0 connection pool)
(ns my-web-app.middleware.jdbc
(:require
[clojure.java.jdbc :as jdbc]
[noir.options :as options])
(:import com.mchange.v2.c3p0.ComboPooledDataSource))
(defn- pooled-data-source
[db-connection-settings]
(let [cpds (doto (ComboPooledDataSource.)
(.setDriverClass (:classname db-connection-settings))
(.setJdbcUrl (str "jdbc:" (:subprotocol db-connection-settings) ":" (:subname db-connection-settings)))
(.setUser (:user db-connection-settings))
(.setPassword (:password db-connection-settings))
;; expire excess connections after 30 minutes of inactivity:
(.setMaxIdleTimeExcessConnections (* 30 60))
;; expire connections after 3 hours of inactivity:
(.setMaxIdleTime (* 3 60 60)))]
{:datasource cpds}))
(def ^{:arglists ([db-connection-settings])} pooled-data-source-as-singleton
(memoize pooled-data-source))
(def pooled-data-source-as-singleton
(memoize pooled-data-source))
(defn wrap-jdbc-connection [handler]
(fn [request]
(jdbc/with-connection
(pooled-data-source-as-singleton (options/get :db-connection-settings))
(handler request))))
(defproject my-web-app
...
[org.clojure/java.jdbc "0.0.6"]
[c3p0/c3p0 "0.9.1.2"]
[hsqldb/hsqldb "1.8.0.10"]]
...
(ns my-web-app.server
(:require
[my-web-app.middleware.jdbc :as jdbc]
[noir.server :as server]))
(def ^:private db-connection-settings {:classname "org.hsqldb.jdbcDriver"
:subprotocol "hsqldb"
:subname "db/test-db"})
(server/load-views "src/order_manager/views/")
(server/add-middleware jdbc/wrap-jdbc-connection)
(defn -main [& m]
(let [mode (keyword (or (first m) :dev))
port (Integer. (get (System/getenv) "PORT" "8080"))]
(server/start port {:mode mode
:ns 'my-web-app
:db-connection-settings db-connection-settings})))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment