Jdbc 如何在clojure中按部分生成惰性序列?

Jdbc 如何在clojure中按部分生成惰性序列?,jdbc,clojure,lazy-loading,lazy-sequences,Jdbc,Clojure,Lazy Loading,Lazy Sequences,我有一个数据库服务器,我从中获取数据。有时数据有数百万行甚至更多,所以我使用惰性来下载。我使用clojure.jdbc库中的服务器端游标惰性地获取数据 现在我有一个问题。我需要从一个延迟序列中生成最初的500个元素,然后程序必须等待10分钟以获得一个信号,该信号向程序报告生成下一个500个元素,依此类推,直到我从服务器接收到所有数据。但是如果10分钟内没有收到报告,程序必须关闭连接 我写了一个例子: (def lazyseq_maps (atom {:seq_1 {:next_500 false

我有一个数据库服务器,我从中获取数据。有时数据有数百万行甚至更多,所以我使用惰性来下载。我使用clojure.jdbc库中的服务器端游标惰性地获取数据

现在我有一个问题。我需要从一个延迟序列中生成最初的500个元素,然后程序必须等待10分钟以获得一个信号,该信号向程序报告生成下一个500个元素,依此类推,直到我从服务器接收到所有数据。但是如果10分钟内没有收到报告,程序必须关闭连接

我写了一个例子:

(def lazyseq_maps (atom {:seq_1 {:next_500 false :data nil} :seq_2 {:next_500 false :data nil}})) ; here is a collection of all unfinished lazy sequences waiting for signal to continue produce elements

(jdbc/atomic conn
 (with-open [cursor (jdbc/fetch-lazy conn sql]
   (let [lazyseq (jdbc/cursor->lazyseq cursor)]
     (swap! lazyseq_maps assoc seq_id {:next_500 true :data nil})
     (loop [lazyseq_rest lazyseq
            count 1]
            (if (:next_500 (seq_id @lazyseq_maps))
              (do
                (swap! lazyseq_maps update-in [seq_id :data] conj (first lazyseq_rest))
                (when (= 0 (mod count 500))
                  (swap! lazyseq_maps assoc-in [seq_id :next_500] false))
                (recur (rest lazyseq) (inc count)))
              ;
              (func-for-waiting-signal)))) ; here I don`t know how to create function waiting signal to continue fetching data
   (seq_id @lazyseq_maps)))

你能帮助我使用什么clojure工具来解决我的问题吗?我假设我应该使用core.async为循环创建通道。我说得对吗?我应该如何创建停止执行循环10分钟的函数,或者在收到适当信号时继续执行该函数?

实际上,您应该使用core.async来实现这一点,它们具有用于超时的通道,并且您可以“等待”从任意数量的通道中弹出一个值。但是,完整的代码将有点复杂。输出行将被“推”到输出通道


据我所知,使用open和惰性序列的
组合不好,因为光标会过早关闭。但是我不熟悉Culjul.JDBC库。

十分钟是很长的时间,让连接打开和不使用,你可能想考虑使用像KEB集分页之类的东西。你能说出你的意思吗?“打开的和懒惰的序列不能很好地构成”我打开了问题是关于你说的吗?