2013-06-05 2 views
4

데이터베이스와 통신해야하는 웹 서비스에서 작업 중이므로 기본 라이브러리를 도구로 사용하여 데스크탑의 postgres에 액세스 할 수있게되었습니다. 내 DB 라이브러리에서Clojure JDBC : Postgres 드라이버를 찾지 못했습니다.

Jun 5, 2013 1:27:46 PM com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask run 
WARNING: [email protected]da -- Acquisition  
Attempt Failed!!! Clearing pending acquires. 
While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). 
Last acquisition attempt exception: 
java.sql.SQLException: No suitable driver 
at java.sql.DriverManager.getDriver(DriverManager.java:264) 

나는 내 단위 테스트에서 다음

(ns myapp.db 
    (:import [com.mchange.v2.c3p0 ComboPooledDataSource])) 

(def specification { 
    :classname "postgresql" 
    :subprotocol "org.postgresql.Driver" 
    :subname "//localhost:5432;database=test" 
}) 

(defn pooled-data-source [specification] 
    (let [datasource (ComboPooledDataSource.)] 
     (.setDriverClass datasource (:classname specification)) 
     (.setJdbcUrl datasource (str "jdbc:" (:subprotocol specification) ":" (:subname specification))) 
     (.setUser datasource (:user specification)) 
     (.setPassword datasource (:password specification)) 
     (.setMaxIdleTimeExcessConnections datasource (* 30 60)) 
     (.setMaxIdleTime datasource (* 3 60 60)) 
     {:datasource datasource})) 

(def connection-pool 
    (delay 
     (pooled-data-source specification))) 

(defn connection [] @connection-pool) 

을 다음 있습니다 :

(ns myapp.db-test 
    (:use clojure.test) 
    (:require [myapp.db] 
       [clojure.java.jdbc :as jdbc])) 

(let [db (myapp.db/connection)] 
    (jdbc/with-connection db) 
     (jdbc/with-query-results rs ["select * from foo"] 
      (doseq [row rs] 
       (println row))))) 

그러나이 때문에 적어도 나는 데이터베이스가있는 REPL에서 작업을 아는가 연결 수락 :

user=> (require '[clojure.java.jdbc :as sql]) 
user=> (sql/with-connection "postgresql://localhost:5432/test" 
      (sql/with-query-results results ["select * from foo"] 
       (doseq [result results] (println result)))) 
{:y 2, :x 1} 
nil 
user=> 

도움을 주시면 대단히 감사하겠습니다!

(defproject myapp "0.1.0" 
    :description "myapp" 
    :dependencies [ 
     [org.clojure/clojure "1.5.1"] 
     [org.clojure/java.jdbc "0.3.0-alpha4"] 
     [postgresql "9.1-901.jdbc4"] 
     [c3p0/c3p0 "0.9.1.2"]]) 

답변

2

나는 당신의 사양을 해결하기 위해 좋을 것

(def specification { 
    :subprotocol "postgresql" 
    :classname "org.postgresql.Driver" 
    :subname "//localhost:5432/test"}) 
2

뿐만 아니라 (내가 해요 아주 많이 Clojure의 초보자) 다른 문제가있을 수 있습니다 다음과 같이

내 project.clj입니다,하지만 당신은 확실히있다 : 클래스 이름과 : 귀하의 사양에 반전 서브 프로토콜을. : classname은 "org.postgresql.Driver"여야합니다. : 서브 프로토콜은 "postgresql"이어야합니다.

관련 문제