遅延シーケンスとwith系マクロの相性の悪さ

(defroutes main-routes
  (GET "/somecsv" []
    (sql/with-connection db
      ;; DBから大量のデータを取って文字列の遅延シーケンスを返す
      (some-table-to-csv-lines ...)
    )))

こういうのを書くと、遅延シーケンスが最後まで計算される前にDBのコネクションがクローズされてしまって、それ以降、未計算の要素を取るとエラーになる。

せっかくRingに遅延シーケンスやストリームが渡せるのに、DBと併用できないのはかなり残念。

Pythonみたいなコルーチンがあればいいんだけど、JavaVMの仕組み上無理そうだ。こういうことをやりたいときは、DBコネクションの管理を手動でやるか、別スレッドを起こしてPipedStreamやSynchronizedQueueでつないでやるしかないのかな。