首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结果集-fn在clojure jdbc返回错误“结果集是关闭的”。为什么?

结果集-fn在clojure jdbc返回错误“结果集是关闭的”。为什么?
EN

Stack Overflow用户
提问于 2017-10-23 09:37:08
回答 1查看 558关注 0票数 5

通常,我需要从数据库服务器加载巨大的数据大小。有时它有上百万行,甚至更多。所以我懒洋洋地下载数据。这就是我想要做的:我想要得到一个延迟序列,并从服务器中提取部分数据,也就是说,如果行数超过500,我首先希望得到该延迟序列前500个元素的帮助,然后通过另一个请求接收下500个元素,以此类推直到我从服务器接收所有数据。

但我有个问题。Clojure实现了整个延迟序列,但我想部分地从它获得数据。我研究了这个问题,并就类似的问题找到了很好的答案:clojure.java.jdbc lazy query

我以这个例子为例写了如下:

代码语言:javascript
复制
(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到第一,或做,或最后,它的工作很好,但它实现了完全懒惰序列!

我用:

  • 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“
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-23 10:03:34

这个延迟序列正在从您的连接中读取值,但是连接在with-db-transaction作用域之外是关闭的。您需要在该范围内实现/执行进一步的处理。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46886158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档