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-05 12:33 pm (UTC)
From: [identity profile] falcrum.livejournal.com
Э-э, а в оракле Role - это совсем другое?

Date: 2012-03-05 12:35 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Оно самое, возможно с мелкими вариациями.

Date: 2012-03-05 12:40 pm (UTC)
From: [identity profile] yantayga.livejournal.com
Мрак какой....

Date: 2012-03-05 12:44 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Не, по сравнению с хаскелем или обычной жабой - это далеко не мрак.

Date: 2012-03-05 12:46 pm (UTC)
From: [identity profile] yantayga.livejournal.com
Скобочек то, скобочек разных... И префиксные операции...

Date: 2012-03-05 12:48 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Да, меня скобки раньше пугали.
Но с нормальной подсветкой они не мешают, кроме того, большую вложенность делать не принято и не обязательно.
А разные виды скобок сильно упрощают синтаксис, делая его лаконичным.

Есть ещё Oracle Universal Connection Pool

Date: 2012-03-05 12:52 pm (UTC)
From: [identity profile] ext_731700 (from livejournal.com)
Несмотря на то, что он от Oracle - он умеет и другие базы (в частности, внутри исходников виден костыль для informix).
Находится на www.oracle.com
см. /technetwork/database/enterprise-edition/downloads/ucp-112010-099129.html

документация на docs.oracle.com
/cd/E11882_01/java.112/e12265/toc.htm
/cd/E11882_01/java.112/e12826/toc.htm

Умеет setRoleName()

Используется, к примеру, так:
(ns xxx
  (:import
   (oracle.ucp.jdbc PoolDataSourceFactory PoolDataSource)))

(def ^PoolDataSource ^{:dynamic true} *datasource*
  (doto (PoolDataSourceFactory/getPoolDataSource)
    (.setConnectionFactoryClassName "org.hsqldb.jdbc.JDBCDriver")
    (.setConnectionFactoryProperties (doto (Properties.)
                                       ;; (.put "sql.syntax_ora" "true")
                                       (.put "hsqldb.default_table_type" "cached")))
    (.setURL "jdbc:hsqldb:file:D:/HSQL/database.db")
    (.setUser "user")
    (.setPassword "password")
    ;; (.setMinPoolSize 5)
    ))

Edited Date: 2012-03-05 12:59 pm (UTC)

Date: 2012-03-05 01:25 pm (UTC)
From: [identity profile] mend0za.livejournal.com
Чёто я тоже мраком занимался два дня на выходных. Чтобы из головы выкинуть тяжёлую поездку в Нюрнберг.

Сломал одну плату (отломал разъём питания при помощи ребёнка от Toradex Iris - Pico ITX Carrier Board, сегодня на работе паял назад). Продолжил крестовый поход по межрассовому смешиванию и впиливанию pkgsrc внутрь Buildroot. Особенно был хорош колл по скайпу с нетбсд-ным разрабом в 24:00 c воскресенья на понедельник, с темой как нам обустроить Рабкрин как использовать его патч для pkgsrc для организации кросс-сборки. Я был уже близок к тому чтобы в могилу проекта buildroot+pkgsrc вбить осиновый кол, а тут бах - и продвинулся ещё на шаг вперёд.
Edited Date: 2012-03-05 01:25 pm (UTC)

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. 24th, 2025 09:01 pm
Powered by Dreamwidth Studios