Clojure JDBC-此ResultSet已关闭

时间:2018-11-01 13:45:00

标签: postgresql jdbc clojure

我目前正在学习使用Clojure以及与postgresql的连接,但遇到了麻烦。在我的代码中,我可以使用SELECT依赖项成功地使用java.jdbc进行查询,但是当我UPDATEINSERT

时出现异常

我正在使用这些依赖项

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

这是我用于SELECT的工作代码-来自名为public."user"的表

(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 %))})))

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

(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创建表,并且得到的结果也相同。

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)

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

今天遇到了同样的问题,根本原因是postgresql Java驱动程序。 from abc import ABC, abstractmethod from collections import defaultdict class CoordType(ABC): registry_by_instance = defaultdict(list) @abstractmethod def coord_translate(self): pass @classmethod def apply_coord_translate(cls, instance): for attr in cls.registry_by_instance(instance): attr.coord_translate() class CoordTpl(CoordType): def __init__(self, creation_instance, coord_tpl): self.coord_tpl = coord_tpl CoordType.registry_by_instance[creation_instance].append(self) def coord_translate(self): # your code to translate class CoordList(CoordType): def __init__(self, creation_instance, coord_list): self.coord_list = coord_list CoordType.registry_by_instance[creation_instance].append(self) def coord_translate(self): # your code to translate class CoordDict(CoordType): def __init__(self, creation_instance, coord_dict): self.coord_dict = coord_dict CoordType.registry_by_instance[creation_instance].append(self) def coord_translate(self): # your code to translate class Foo(object): def __init__(self, coord_tpl, coord_list, coord_dict, blah): # a single coord tuple # e.g. ((1, 2), (11, 22)) self.coord_tpl = CoordTpl(self.coord_tpl) # a list of coord tuple # e.g. [((1, 2), (11, 22)), ((3, 4), (33, 44))] self.coord_list = CoordList(self, coord_list) # a dict, whose value is a list of coord tuple # e.g. { 0: [((1, 2), (11, 22)), ((3, 4), (33, 44))], 1: [((5, 6), (55, 66)), ((7, 8), (77, 88))] } self.coord_dict = CoordDict(self, coord_dict) # some non-coord attributes self.blah = blah def coord_translate(self): CoordType.coord_translate(self) 已有5年历史,升级到42.2.6后问题就消失了。

答案 3 :(得分:0)

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