Ад, заборы, коровники
Mar. 5th, 2012 03:23 pmУспешно скрестил Clojure, c3p0 connection pool и Firebird JDBC driver (Jaybird):
Проблема(из-за которой даже пришлось выпилить korma) изначально была в том, что c3p0 сам по себе роль для коннекта не передавал. Роль, судя по всему - понятие сугубо для Firebird, причем даже там ими почти никто не пользуется, "слишком сложно". Примеров на тему "как передать роль" вообще почти нет, документация разрозненная и бредовая, пришлось перекопать исходники jaybird и c3p0, чтобы найти методику ее передачи.
(ns org.nii.operden
(:require [clojure.java.jdbc :as sql])
(:use org.nii.operden.settings)
(:import (javax.sql DataSource))
(:import (com.mchange.v2.c3p0 DataSources ComboPooledDataSource))
(:import (java.util Properties))
)
;;параметры коннекта. пригодны для использования в clojure.java.jdbc/with-connection
(def
dbspec
(let [user (get mainConfig "firebird.user" "")
rolename (get mainConfig "firebird.rolename" "")
pass (get mainConfig "firebird.password" "")
subname (get mainConfig "firebird.subname" "//localhost/operden")
encoding (get mainConfig "firebird.encoding" "WIN1251")]
{:classname "org.firebirdsql.jdbc.FBDriver"
:subprotocol "firebirdsql"
:user user
:roleName rolename
:password pass
:subname subname
:encoding encoding}))
;передать роль для коннекта в jaybird через c3p0
(defn roleProp
[role]
(doto (Properties.)
(.put "roleName" role))
)
;функция нагло стырена из korma и модифицирована
;возвращает DataSource, который так же пригоден для использования
; в clojure.java.jdbc/with-connection
(defn connection-pool
"Create a connection pool for the given database spec."
[spec]
(let [excess (or (:excess-timeout spec) (* 30 60))
idle (or (:idle-timeout spec) (* 3 60 60))
cpds (doto (ComboPooledDataSource.)
(.setDriverClass (:classname spec))
(.setJdbcUrl (str "jdbc:" (:subprotocol spec) ":" (:subname spec)))
(.setProperties (roleProp (:roleName spec)))
(.setUser (:user spec))
(.setPassword (:password spec))
(.setAcquireRetryAttempts 3)
(.setMinPoolSize 5)
(.setMaxPoolSize 30)
(.setMaxIdleTimeExcessConnections excess)
(.setMaxIdleTime idle))]
{:datasource cpds}))
(def db (connection-pool dbspec))
Проблема(из-за которой даже пришлось выпилить korma) изначально была в том, что c3p0 сам по себе роль для коннекта не передавал. Роль, судя по всему - понятие сугубо для Firebird, причем даже там ими почти никто не пользуется, "слишком сложно". Примеров на тему "как передать роль" вообще почти нет, документация разрозненная и бредовая, пришлось перекопать исходники jaybird и c3p0, чтобы найти методику ее передачи.
no subject
Date: 2012-03-05 12:33 pm (UTC)no subject
Date: 2012-03-05 12:35 pm (UTC)