postgresql - clojure.java.jdbc 惰性查询

标签 postgresql jdbc clojure

我有一个基本上是 select * 的查询。在开发中这个表只有 30000 行,但在生产中它会更大。所以我想懒惰地使用这个查询。为什么下面的查询不是惰性的? 我正在使用 Postgres 9.5.4.1。

(do
  (def pg-uri {:connection-uri "jdbc:postgresql://localhost/..."})
  (def row (atom 0))
  (take 10 (clojure.java.jdbc/query 
          pg-uri
          ["select * from mytable"]
          {:fetch-size 10
           :auto-commit false
           :row-fn (fn [r] (swap! row inc))}))
  @row) ;;=> 300000

最佳答案

首先,请参阅 https://jdbc.postgresql.org/documentation/83/query.html#query-with-cursor .

这样解决了。

(jdbc/with-db-transaction [tx connection]
  (jdbc/query tx
    [(jdbc/prepare-statement (:connection tx)
                              "select * from mytable"
                              {:fetch-size 10})]
     {:result-set-fn (fn [result-set] ...)}))

其中 :result-set-fn 是一个使用惰性结果集的函数。

with-db-transaction 负责将 autoCommit 设置为 false:fetch-size 不是从 query 传递过来的,所以你必须自己做一个 prepare-statement

关于postgresql - clojure.java.jdbc 惰性查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765943/

相关文章:

javascript - 序列化 : How to query model by 1:n association, 但在单个查询中包含所有关联对象 (PostgreSQL)

java - 如何以正确的方式更新生产中的 Hibernate 应用程序?

java - 使用 JDBC 将数据添加到 postgreSQL 中的表的正确方法?

java - 如何在 JSP/Servlet 中重用数据库连接?

clojure - 我怎样才能改进这个 Clojure 功能?

clojure - 获取leiningen项目根目录

postgresql - 在文本 Postgres 中找到 "'"

php - "no pg_hba.conf entry for host"但 "LOG: connection authorized"

java - JDBC SQL SELECT 查询总和方法行为不正确

mysql - clostache/render 函数中是否有多个参数?