gpt4 book ai didi

mysql - 使用 clojure.java.jdbc 从 MySQL 流式传输

转载 作者:可可西里 更新时间:2023-11-01 07:45:26 26 4
gpt4 key购买 nike

根据 the release notes for the MySQL JDBC driver ,当且仅当使用具有并发只读、只进结果且提取大小恰好为 Integer/MIN_VALUE 的连接时,它才应该流式传输结果。

但是,当我尝试准确生成这些条件时(针对 [mysql/mysql-connector-java "5.1.21"]),我的 SQL 查询仍然会永远运行(或者更确切地说,直到它耗尽了 JVM 的内存并变得繁荣)。

(let [query (query-only (fetch-all big-table))]
(clojure.java.jdbc/with-connection (get-connection (:db query))
(clojure.java.jdbc/with-query-results rows
(into [{:fetch-size Integer/MIN_VALUE
:concurrency :read-only
:result-type :forward-only} (:sql-str query)]
(:params query))
(throw (Exception. (str "retrieved a row: " (pr-str (first rows)))))))))

最佳答案

这个答案指的是 postgresql 而不是 MySQL,但应该适用于两者。

用 (clojure.java.jdbc/transaction) 包装你的 with-query-results 函数,所以:

(let [query (query-only (fetch-all big-table))]
(clojure.java.jdbc/with-connection (get-connection (:db query))
(clojure.java.jdbc/transaction
(clojure.java.jdbc/with-query-results rows
(into [{:fetch-size Integer/MIN_VALUE
:concurrency :read-only
:result-type :forward-only} (:sql-str query)]
(:params query))
(throw (Exception. (str "retrieved a row: " (pr-str (first rows))))))))))

The postgresql docs指定启用流的另一个要求:“连接不得处于自动提交模式。”默认情况下,连接是在启用自动提交的情况下创建的,但是使用 (clojure.java.jdbc/transaction) 包装将在关闭自动提交的情况下运行内部代码。您也可以自己在连接上调用 .setAutoCommit。

关于mysql - 使用 clojure.java.jdbc 从 MySQL 流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11790291/

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