Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用clojure.java.jdbc从MySQL流式传输_Mysql_Jdbc_Clojure - Fatal编程技术网

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

使用clojure.java.jdbc从MySQL流式传输,mysql,jdbc,clojure,Mysql,Jdbc,Clojure,根据,当且仅当使用具有并发只读、仅转发结果和取数大小正好为整数/MIN_值的连接时,它应流式传输结果 然而,当我试图准确地生成这些条件时(针对[mysql/mysql connector java“5.1.21”]),我的SQL查询仍然会永远运行(或者,更确切地说,直到耗尽JVM内存并开始运行) 由于带有查询结果的也将接受原始PreparedStatement,因此您可以尝试自己创建一个,显式地传递所有正确的参数,并查看是否有任何不同的行为。这至少会告诉您问题出在clojure.java.jdb

根据,当且仅当使用具有并发只读、仅转发结果和取数大小正好为整数/MIN_值的连接时,它应流式传输结果

然而,当我试图准确地生成这些条件时(针对
[mysql/mysql connector java“5.1.21”]
),我的SQL查询仍然会永远运行(或者,更确切地说,直到耗尽JVM内存并开始运行)


由于带有查询结果的
也将接受原始PreparedStatement,因此您可以尝试自己创建一个,显式地传递所有正确的参数,并查看是否有任何不同的行为。这至少会告诉您问题出在clojure.java.jdbc创建PreparedStatement上,还是您需要更深入地查看驱动程序/数据库配置。

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

将with查询结果函数包装为(clojure.java.jdbc/transaction),以便:


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

这里的问题是,您没有处理从DB流式传输的结果——只有在您拥有完整的结果集时。请看,这与OP遇到的问题相同:只有在拥有整个结果集时才会执行
抛出。看见
(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)))))))))
(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))))))))))