2012-04-10 66 views
2

我已经创造了一些Clojure的功能来访问数据库,如下图所示的代码片段的SQLException异常:不能理解的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 

任何想法为什么?

感谢

回答

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)))))) 
+0

感谢您的回答。我怀疑懒惰的评估可能是原因。显然,(.debug)强制序列评估。 – kostas 2012-04-10 08:14:49

2

我不是100%肯定,但我想这个问题是,这个结果是序列懒惰,你的时间处理它的数据库连接被关闭(你是with-connect外)。

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

一些小的文体评论:

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

的,如果不是SEQ东西,可以简化为:

(if (seq rows) 
    rows) 

(甚至只是rows,如果它只能是一个序列或nil反正)