关于postgresql:Clojure JDBC-此ResultSet已关闭

Clojure JDBC - This ResultSet is closed

我目前正在学习使用Clojure和与postgresql的连接,但遇到问题。 在我的代码中,我可以使用java.jdbc依赖项使用SELECT成功查询,但是在我UPDATEINSERT时遇到异常

我正在使用这些依赖项

1
2
[org.clojure/java.jdbc"0.7.8"]
[postgresql"9.3-1102.jdbc41"]

这是我在名为public."user"的表中用于SELECT -ing的工作代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(ns knp-api.model.user
  (:require [clojure.java.jdbc :AS SQL]))


(def db"jdbc:postgresql://ampersanda@localhost:5432/idjoesoft_klinik")

(defn get-COUNT [q]
 "Get count key from query
   It takes jdbc.query as parameter"

  (:COUNT (FIRST (INTO [] q))))

(defn is-user-email-available? [e]
 "Returns boolean when email is available.
   Take one parameter, it's email"

  (let [q"SELECT COUNT(*) FROM public.\"user\" t WHERE user_email = ?"]
    (SQL/query db [q e] {:result-set-fn #(= 1 (get-COUNT %))})))

这不是我的代码使出现异常

1
2
3
4
5
6
7
8
(defn set-user-timestamp-and-token [email token TIMESTAMP]
 "update user current token and last login time inside database.
   Takes email, token, and current timestamp as parameter"

  (SQL/UPDATE! db
              "public.\"user\""
               {:user_last_login (str"to_timestamp(" TIMESTAMP")")
                :user_token token}  
               ["user_email = ?" email]))

这是例外

enter image description here

更新

我也尝试使用REPL创建表,我也得到了相同的结果。

1
2
3
4
5
knp-api.handler=> (require '[clojure.java.jdbc :as sql])
nil
knp-api.handler=> (sql/db-do-commands"jdbc:postgresql://ampersanda@localhost:5432/idjoesoft_klinik" (sql/create-table-ddl :testing [[:data :text]]))

PSQLException This ResultSet is closed.  org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkClosed (AbstractJdbc2ResultSet.java:2852)


今天遇到了同样的问题,根本原因是postgresql java驱动程序。
postgresql"9.3-1102.jdbc41"已有5年历史,升级到42.2.6后,问题消失了。


我怀疑更新进行得很好,然后尝试返回已更改的行,并尝试将其作为惰性序列执行。连接关闭后,尝试打印/处理延迟结果序列的操作可能正在执行此操作。

请尝试将select语句包装在对doall的调用中,以确保可以立即读取它,并且不允许将其作为惰性数据库。


花了一段时间尝试解决这个问题后,我可以在我的情况下确认更新postgresql java驱动程序已解决了该问题,如果有人遇到相同的问题,请尝试使用clojars / maven中的最新驱动程序,Clojars甚至会显示一条消息,告诉您您应该使用Maven Central的版本。


我记得有这个问题,但是已经有很多年了,我不记得解决方案了。但是,将原始JDBC包装在Clojure中不是一个好主意。有许多出色的Clojure库,使使用数据库变得更加容易。我特别推荐SQL Korma和Hug SQL。