Postgresql Clojure JDBC-此结果集已关闭

Postgresql Clojure JDBC-此结果集已关闭,postgresql,jdbc,clojure,Postgresql,Jdbc,Clojure,我目前正在学习使用Clojure和与postgresql的连接,我被卡住了。在我的代码中,我可以使用SELECT使用java.jdbc依赖项成功地查询,但在我UPDATE或INSERT 我正在使用这些依赖项 [org.clojure/java.jdbc "0.7.8"] [postgresql "9.3-1102.jdbc41"] 这是我的工作代码,从名为public的表中选择-ing。“user” 这不是我的代码,它会出现异常 (defn set-user-timestamp-and-tok

我目前正在学习使用Clojure和与postgresql的连接,我被卡住了。在我的代码中,我可以使用
SELECT
使用
java.jdbc
依赖项成功地查询,但在我
UPDATE
INSERT

我正在使用这些依赖项

[org.clojure/java.jdbc "0.7.8"]
[postgresql "9.3-1102.jdbc41"]
这是我的
工作代码,从名为
public的表中选择
-ing。“user”

这不是我的代码,它会出现异常

(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]))
这是个例外

更新

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

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)

我怀疑更新进行得很顺利,然后它试图返回更改的行,并且它试图以惰性序列的方式返回。尝试打印/处理延迟结果序列的东西可能在连接关闭后执行


尝试在调用
doall
时包装select语句,以确保立即读取它,并且不允许它成为惰性数据库。

我记得有过这个问题,但它是多年前的问题,我不记得解决方案了。然而,在Clojure中包装原始JDBC并不是一个好主意。有许多优秀的Clojure库,使使用数据库更加容易。我要特别推荐和。

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

花了一段时间试图解决这个问题,我可以确认在我的案例中,更新postgresql java驱动程序解决了这个问题,如果有人有同样的问题,请尝试使用clojars/maven的最新驱动程序,Clojars甚至有一条消息告诉您应该使用maven central的版本。

如果在关闭结果集后使用该结果集,则会发生错误本身。例如,如果在自动提交模式下执行多个交错语句,则可能发生这种情况。您还使用了非常旧版本的PostgreSQL JDBC驱动程序。感谢您的回复。对PostgreSQL JDBC驱动程序有什么建议吗?我是按照Heroku的步骤来做的。@MochamadLuckyPradana:这有什么好运气吗?@Ashwin:不幸的是,没有:(,我使用了
funcool/clojure.jdbc
而不是。因此,我尝试用
doall
包装我的SELECT查询,在我的
函数中是否有用户电子邮件可用?
函数,但我得到了一个不同的错误,即
不知道如何从java.lang.Boolean
创建ISeq。此函数应返回布尔值,因此我将代码更改为
(让[q”从public.\'user\'t中选择COUNT(*),其中user\'u email=?“](=1(第一个(doall(map:COUNT(sql/query db[qe])))))))
它成功地返回布尔值,但当我执行
更新
查询时,它仍然是关于ResultSet的相同错误为EmptyTanks以供检查,这是一个常见错误,我将把它留给其他有类似情况的人,尽管它似乎不是您问题的答案。如果您在几分钟内没有得到正确的答案几天之后,我会在这个问题上悬赏,以争取更多的关注。我会继续尝试搜索答案,如果我发现了什么,我会更新。谢谢你的帮助。远离Korma!它有缺陷而且没有维护。看看项目的github问题,你自己我还没有尝试过,但谢谢你的回答
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)