2

我创建了一些 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

知道为什么吗?

谢谢

4

2 回答 2

2

我不是 100% 确定,但我想问题是,结果 seq 是惰性的,当你处理它时,数据库连接已关闭(你在 .seq 之外with-connect)。

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

一些小的风格评论:

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

if not seq 的事情,可以简化为:

(if (seq rows)
    rows)

(或者甚至只是rows,如果它只能是一个 seq 或nil无论如何)

于 2012-04-10T07:37:47.793 回答
1

“行”是懒惰的。而且似乎“(.debug log rows)”评估了“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))))))
于 2012-04-10T07:57:49.283 回答