我在使用 clojure.java.jdbc 从 MySQL 数据库流式传输大型结果集时遇到问题。这就是我现在正在尝试的:
(defn etl! [query result-set-fn]
(jdbc/with-db-transaction [t-conn db-spec]
(let [conn (jdbc/get-connection t-conn)
statement (jdbc/prepare-statement conn query
:fetch-size Integer/MIN_VALUE
:concurrency :read-only
:result-type :forward-only)]
(jdbc/query conn [statement] :result-set-fn first))))
我也尝试过在没有交易的情况下使用 (.setAutoCommit conn False)
(这对于 Postgres 是必需的)。根据 MySQL 文档,设置获取大小、并发性和结果类型应该告诉 MySQL 一次传递一个结果,但这似乎并没有发生;查询挂起,堆消耗稳定上升至少数百兆字节。
几年前有人问过类似的问题,但答案现在已被 clojure.java.jdbc 弃用: Streaming from MySQL with clojure.java.jdbc
有什么想法吗?
最佳答案
这与这个问题非常相似:clojure.java.jdbc lazy query它有几个答案,包括我的最新答案,它指的是最近添加的 reducible-query
。我还没有直接确认您需要什么样的选项组合才能说服 MySQL 流式传输结果集,但是 :fetch-size
和各种游标设置可能会有用。 PostgreSQL 需要 :auto-commit? false
以及 - 我不确定您是否也需要 MySQL。
关于mysql - 如何使用 clojure.java.jdbc 从 MySQL 数据库延迟流式传输结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31234784/