首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure JDBC:找不到Postgres驱动程序

Clojure JDBC:找不到Postgres驱动程序
EN

Stack Overflow用户
提问于 2013-06-06 04:35:23
回答 2查看 1.4K关注 0票数 4

我正在处理一个需要与数据库对话的web服务,所以我正在准备我的基本库,以便在我的桌面上访问postgres。

代码语言:javascript
复制
Jun 5, 2013 1:27:46 PM com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask run
WARNING: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@15c313da -- 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)

在我的db库中,我有以下内容

代码语言:javascript
复制
(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)

然后在我的单元测试中:

代码语言:javascript
复制
(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中是有效的,所以至少我知道数据库已经启动并接受连接:

代码语言:javascript
复制
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=>

非常感谢您对此的帮助!

我的project.clj如下

代码语言:javascript
复制
(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"]])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-06 07:03:17

我建议修改你的规格书

代码语言:javascript
复制
(def specification {
    :subprotocol "postgresql"
    :classname "org.postgresql.Driver"
    :subname "//localhost:5432/test"})
票数 2
EN

Stack Overflow用户

发布于 2013-06-06 07:02:44

可能还有其他问题(我是个clojure新手),但您肯定会遇到:classname和:subprotocol在您的规范中颠倒的问题。:类名应该是"org.postgresql.Driver“。:子协议应为postgresql。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16949377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档