metaclass: (Default)
[personal profile] metaclass
Успешно скрестил Clojure, c3p0 connection pool и Firebird JDBC driver (Jaybird):



(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, чтобы найти методику ее передачи.

Date: 2012-03-07 08:50 pm (UTC)
From: [identity profile] avnik.livejournal.com
Ребе, я тут намедни настоящий ад с коровниками узрел -- Кложуру-на-петоне

https://github.com/halgari/clojure-py

(запускать правда не пробовал, просто на код повтыкал)

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 28th, 2025 03:03 am
Powered by Dreamwidth Studios