通常,我需要从数据库服务器加载巨大的数据大小。有时它有上百万行,甚至更多。所以我懒洋洋地下载数据。这就是我想要做的:我想要得到一个延迟序列,并从服务器中提取部分数据,也就是说,如果行数超过500,我首先希望得到该延迟序列前500个元素的帮助,然后通过另一个请求接收下500个元素,以此类推直到我从服务器接收所有数据。
但我有个问题。Clojure实现了整个延迟序列,但我想部分地从它获得数据。我研究了这个问题,并就类似的问题找到了很好的答案: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 set is closed.为什么?但是,当我改变:结果集fn到第一,或做,或最后,它的工作很好,但它实现了完全懒惰序列!
我用:
[com.microsoft.sqlserver/mssql-jdbc "6.3.3.jre8-preview"] (但是我在postgresql [org.postgresql/postgresql "9.4.1212.jre7"]上测试它。相同的结果)发布于 2017-10-23 10:03:34
这个延迟序列正在从您的连接中读取值,但是连接在with-db-transaction作用域之外是关闭的。您需要在该范围内实现/执行进一步的处理。
https://stackoverflow.com/questions/46886158
复制相似问题