gpt4 book ai didi

sql-server - :result-set-fn in clojure jdbc return error "The result set is closed." Why?

转载 作者:太空狗 更新时间:2023-10-30 01:51:50 24 4
gpt4 key购买 nike

我经常需要从数据库服务器加载大量数据。有时它有数百万行甚至更多。所以我尝试懒惰地下载数据。那就是我想做的:我想要一个惰性序列并从服务器中提取部分数据,即如果行数超过 500,我主要想借助该惰性序列的前 500 个元素,然后通过另一个请求我想要接收接下来的 500 个元素等等,直到我从服务器接收到所有数据。

但是我有一个问题。 Clojure jdbc 实现了整个惰性序列,但我想从中获取部分数据。我研究了那个问题并找到了关于类似问题的好回复: clojure.java.jdbc lazy query

我拿这个例子写了这个:


(defn get_data
[arg1 arg2]
(let [full-db-spec (get ...)
sql_query (get ...)
row-n (atom 0)
prepared-statement (-> full-db-spec
(jdbc/get-connection)
(jdbc/prepare-statement sql_query {:fetch-size 3}))]
(jdbc/with-db-transaction [tx full-db-spec]
(jdbc/query full-db-spec [prepared-statement arg1 arg2]
{:fetch-size 3
:row-fn (fn [r] (do (prn "r" @row-n) (swap! row-n inc) r))
:result-set-fn identity}))))

这里我想得到一个惰性序列,进一步从这个惰性序列中提取部分数据。但是当 :result-set-fn 包含 identity(take 500 ...) 代码返回错误: The result集合已关闭。 为什么?但是当我将 :result-set-fn 更改为 first 或 doall 或 last 它工作正常但它实现了完整的惰性序列!

我使用:

  • ms sql [com.microsoft.sqlserver/mssql-jdbc "6.3.3.jre8-preview"](但我在 postgresql [org.postgresql/postgresql "9.4 .1212.jre7"]。结果相同)
  • [org.clojure/java.jdbc "0.7.3"]

最佳答案

惰性序列正在从您的连接中读取值,但连接在 with-db-transaction 范围之外关闭。您需要在该范围内实现/进行进一步处理。

关于sql-server - :result-set-fn in clojure jdbc return error "The result set is closed." Why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46886158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com