Вам не нужны транзакции и подготовленные материалы выше. Это использование :result-set-fn
, что приводит к потреблению ленивой последовательности. Возможно, вы использовали вместо этого :row-fn
.
Для получения более подробной информации please see The Clojure Cookbook. Имеется также версия для печати, которую я рекомендую.
Функция jdbc/query имеет несколько необязательных параметров ключевого слова, которые определяют, как он создает возвращаемый результирующий набор. Параметр: result-set-fn указывает функцию, которая применяется ко всему результату set (ленивая последовательность) до его возврата. Аргумент по умолчанию является функция DOALL:
(defn hi-lo [rs] [(first rs) (last rs)])
;; Find the highest- and lowest-cost fruits
(jdbc/query db-spec
["select * from fruit order by cost desc"]
:result-set-fn hi-lo)
;; -> [{:grade nil, :unit nil, :cost 77, :appearance nil, :name "Kumquat"}
;; {:grade 1.4, :unit nil, :cost 10, :appearance "rotten", :name "Tomato"}]
: строка-Fn параметр определяет функцию, которая применяется к каждой строке результата, как результат построен. По умолчанию аргумент функция идентичности:
(defn add-tax [row] (assoc row :tax (* 0.08 (row :cost))))
(jdbc/query db-spec
["select name,cost from fruit where cost = 12"]
:row-fn add-tax)
;; -> ({:tax 0.96, :cost 12, :name "Plum"} {:tax 0.96, :cost 12, :name "Fig"})
Может быть, это старше С.О. вопрос и ответы будут актуальны, не уверены: http://stackoverflow.com/questions/19728538/clojure-java-jdbc-query-large-resultset-lazily – Josh