无法理解clojure中的SQLException异常

时间:2012-04-10 07:06:32

标签: jdbc clojure

我创建了一些clojure函数来访问数据库,如下面的代码段所示:

(defn get-dg [date]
  (let [query (str "......")
        ]
    (jdbc/with-connection db
      (jdbc/with-query-results rows 
          [query date date date date]
          (.debug log rows)
          (if (not (seq rows)) 
           nil
           rows))))
)

一切正常。查询返回一个我可以处理的结果集。现在,如果我注释掉(.debug日志行),我会得到这个:

java.lang.RuntimeException: java.sql.SQLException: Closed Resultset: next

知道为什么吗?

由于

2 个答案:

答案 0 :(得分:2)

我不是百分百肯定,但我想问题是,结果seq是懒惰的,当你处理它时,数据库连接被关闭(你在with-connect之外)。

您的调试语句在连接仍处于打开状态时强制实现。

一些轻微的风格评论:

您不必使用str将字符串转换为字符串。

如果不是seq的话,可以简化为:

(if (seq rows)
    rows)

(或者只是rows,如果它只能是seq或nil

答案 1 :(得分:1)

“行”是懒惰的。而且似乎“(.debug log rows)”评估了“行”。只是明确地做:

(defn get-dg [date]
  (let [query (str "......") ]
    (jdbc/with-connection db
      (jdbc/with-query-results rows [query date date date date]
        (comment .debug log rows)
        (if (empty? rows) nil (doall rows))))))