Clojure 使用future:并行运行sql,但不执行sql

Clojure 使用future:并行运行sql,但不执行sql,clojure,future,Clojure,Future,我有以下功能 (defn run [x] (doseq [i (range 1 x)] (println i) (future (j/execute! vertica-db ["insert /*+ direct */ into a select * from a limit 1"])) )) 什么时候叫它使用 (run 100) 它将打印1..99,但是如果检查表a的行号,行号不会增加,这意味着sql不会执行。如何并行运行sql?我在您的

我有以下功能

(defn run [x]          
  (doseq [i  (range 1 x)]
     (println i)
     (future (j/execute! vertica-db ["insert /*+ direct */ into a select * from a limit 1"]))
   ))
什么时候叫它使用

(run 100)

它将打印1..99,但是如果检查表a的行号,行号不会增加,这意味着sql不会执行。如何并行运行sql?

我在您的代码中看到的唯一可疑的事情是,您从不等待未来的完成(所以可能它们不会?)

您需要收集
future
调用返回的值,然后使用
(deref f)
/
@f
(即取消对future的引用)进行阻塞,直到调用结束,其中
f
是这些值之一

像这样的方法应该会奏效:

(defn run [x]
  (let [db-insert (fn [i] ((println i) (future (j/execute! vertica-db ["insert /*+ direct */ into a select * from a limit 1"]))))
        inserts (doall (map db-insert (range 1 x)))] ;force execution of all the db-insert calls
        (doseq [insert inserts] @insert))) ;wait for all the futures to finish

您是否检查过您的sql代码是否在没有未来的情况下工作?是的,它可以工作。另外,如果我只是使用dotimes而不是doseq,它也可以工作。也许doseq很懒?@DanielWu
doseq
很渴望。如果不是的话,它与副作用一起使用会变得更加困难(也就是说,必须强制它才能产生副作用)。当我获取您的代码并用一个简单的println语句替换SQL执行代码时,它会被执行。不管是什么问题,我严重怀疑它与使用
doseq
future
有关。我不需要等待,因为我正在测试多重插入。dotimes有效,而doseq无效。不知道为什么会这样different@DanielWu我想说的是,如果你等待期货交易结束,你可以确定这些语句已经执行(或失败)。如果没有这一点,你可能已经够倒霉了,在所有期货返回之前检查数据库。很长一段时间,但值得一试,因为我看不到您的代码有任何其他问题。