Clojure中传递PostgreSQL连接URI时出现JDBC连接超时问题
解决Clojure连接CockroachDB(PostgreSQL兼容)超时问题
1. 先修复代码中的变量引用错误
你定义的连接配置是pg-uri,但查询函数里误用了未定义的pg-db,这会直接导致连接逻辑失效。同时必须手动关闭连接避免资源泄漏:
(def pg-uri {:connection-uri "jdbc:postgresql://user:password@host.aws-us-west-2.cockroachlabs:12345/defaultdb?sslmode=verify-full&options=--cluster=foobar"}) (defn query [q] (let [conn (j/get-connection pg-uri)] (try (j/query conn q) (finally (.close conn))))) ; 必须在finally块关闭连接
2. 显式配置SSL根证书(关键)
你的连接URI用了sslmode=verify-full,但JDBC驱动不会自动加载根证书——其他客户端能正常连接,大概率是因为它们默认读取了系统路径下的CockroachDB根证书。需要在配置中添加sslrootcert参数:
;; 拆分配置为键值对,更易排查问题 (def pg-config {:dbtype "postgresql" :dbname "defaultdb" :host "host.aws-us-west-2.cockroachlabs" :port 12345 :user "user" :password "password" :sslmode "verify-full" :options "--cluster=foobar" :sslrootcert "/path/to/cockroach-root.crt"}) ; 替换为你的根证书路径
3. 使用连接池管理连接
直接每次创建新连接容易引发超时和资源耗尽问题,推荐用HikariCP连接池(Clojure JDBC官方推荐):
首先在project.clj添加依赖:
[com.zaxxer/HikariCP "5.0.1"] [org.clojure/java.jdbc "0.7.12"]
然后配置并使用数据源:
(def ds (jdbc/get-datasource pg-config)) (defn query [q] (jdbc/query ds q)) ; 连接池自动处理连接的创建、复用和销毁
4. 验证URI参数编码
URI中options=--cluster%3Dfoobar的%3D是=的URL编码,理论上合法,但部分JDBC驱动对编码的处理可能存在差异,可以尝试直接使用未编码的=:
jdbc:postgresql://user:password@host.aws-us-west-2.cockroachlabs:12345/defaultdb?sslmode=verify-full&options=--cluster=foobar
内容的提问来源于stack exchange,提问作者reactor
相关产品推荐
相关产品推荐

