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 が遅延していて、それを処理するまでに db 接続が閉じられていることだと思います (あなたは の外にいますwith-connect)。

デバッグ ステートメントは、接続がまだ開いている間に実現を強制します。

文体に関するマイナーなコメント:

文字列を文字列に変換するために str を使用する必要はありません。

if not seq は、次のように簡略化できます。

(if (seq rows)
    rows)

(またはrows、それが seq またはnilとにかくのみである場合は、 just にも)

于 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 に答える