2012-04-10 41 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反正)