mysql - 如何使用 clojure.java.jdbc 从 MySQL 数据库延迟流式传输结果?

标签 mysql jdbc clojure

我在使用 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/

相关文章:

clojure - 如何在给定上限的情况下计算向量中的个数

MySQL 如果一行出现两次只显示一次,但如果它出现 n 次(不能是两次)则显示它的名字 n 次?

php - 来自模型的 Magento SQL 查询

java - 如何使用 JDBC 在 Java 中获取存储过程的多个 SELECT 语句

clojure - "let"的功能替代

emacs - 使用 Emacs Starter Kit 时禁用 Emacs 中的 hl-line?

c# - 数据库更新不起作用

mysql - 从数据库中检索四个字段有两个值的行

postgresql - 如何使用 clojure.java.jdbc 进行 UPSERT

java oracle jdbc 结果集为空,但表中记录可用