我创建了一些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
知道为什么吗?
由于
答案 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))))))