2012-04-10 13 views
2

ich einige clojure Funktion erstellt haben, auf eine Datenbank zuzugreifen, wie weiter unten im Snippet gezeigt:Kann nicht verstehen SQLException Ausnahme in 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)))) 
) 

Alles funktioniert gut. Die Abfrage gibt eine Ergebnismenge zurück, die ich dann verarbeiten kann. Nun, wenn ich auskommentieren (. Debug Log-Zeilen) bekomme ich das:

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

Irgendeine Idee warum?

Dank

Antwort

1

"Reihen" faul sind. Und es scheint, dass "(. Debug log rows)" die "Zeilen" ausgewertet hat. Nur tun Sie es ausdrücklich:

(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

Danke für die Antwort. Ich vermutete, dass eine faule Bewertung der Grund sein könnte. Anscheinend (.debug) erzwungene Sequenzbewertung. – kostas

2

ich nicht 100% sicher bin, aber ich denke, dass das Problem ist, dass das Ergebnis f faul ist und durch die Zeit, die Sie die DB-Verbindung bearbeiten wird geschlossen (Sie sind außerhalb der with-connect).

Ihre Debug-Anweisung erzwingt die Realisierung, solange die Verbindung noch offen ist.

Einige kleinere stilistische Kommentare:

Sie müssen str nicht verwenden, um eine Zeichenfolge in eine Zeichenfolge zu konvertieren.

Der wenn nicht seq Sache, kann vereinfacht werden:

(if (seq rows) 
    rows) 

(oder sogar nur rows wenn es nur ein seq oder nil ohnehin sein kann)