Ад, заборы, коровники
Mar. 5th, 2012 03:23 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Успешно скрестил 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)no subject
Date: 2012-03-05 12:40 pm (UTC)no subject
Date: 2012-03-05 12:44 pm (UTC)no subject
Date: 2012-03-05 12:46 pm (UTC)no subject
Date: 2012-03-05 12:48 pm (UTC)Но с нормальной подсветкой они не мешают, кроме того, большую вложенность делать не принято и не обязательно.
А разные виды скобок сильно упрощают синтаксис, делая его лаконичным.
Есть ещё Oracle Universal Connection Pool
Date: 2012-03-05 12:52 pm (UTC)Находится на 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()
Используется, к примеру, так:
no subject
Date: 2012-03-05 01:25 pm (UTC)Сломал одну плату (отломал разъём питания при помощи ребёнка от Toradex Iris - Pico ITX Carrier Board, сегодня на работе паял назад). Продолжил крестовый поход по межрассовому смешиванию и впиливанию pkgsrc внутрь Buildroot. Особенно был хорош колл по скайпу с нетбсд-ным разрабом в 24:00 c воскресенья на понедельник, с темой
как нам обустроить Рабкринкак использовать его патч для pkgsrc для организации кросс-сборки. Я был уже близок к тому чтобы в могилу проекта buildroot+pkgsrc вбить осиновый кол, а тут бах - и продвинулся ещё на шаг вперёд.no subject
Date: 2012-03-07 08:50 pm (UTC)https://github.com/halgari/clojure-py
(запускать правда не пробовал, просто на код повтыкал)