3

编辑

事实证明,N00b 问题。我没有意识到运行lein ring server会导致您的应用程序以解释模式运行,这就是它慢得多的原因。


可以优化以下 Clojure/JDBC 片段以使其运行(更快)速度吗?

(defn test-sql []
  (sql/with-connection (db-connection)
    (sql/with-query-results results ["select * from users order by username asc"]
        (doseq [row results ] 
          (println "User" (row :first_name) (row :last_name)) results))))

我正在考虑将 Clojure 用于 ETL 项目。我写的第一个测试是从我有大约 280K 记录的表中打印出数据。到目前为止,我提出的实现非常缓慢。在 Java 中大约需要 12 秒(即使使用 myBatis 填充对象而不是“原始”访问)使用我的 Clojure 解决方案需要大约 9.5 分钟。

我尝试使用地图而不是doseq,并尝试使用此处概述的光标:http://asymmetrical-view.com/2010/10/14/clojure-and-large-result-sets.html 但我得到的结果大致相同每个的执行时间。

FWIW,执行.println java.lang.System/out(不足为奇)和使用 with-query-results* 时的结果相同:

(defn test-sql2 []
  (sql/with-connection (db-connection)
    (sql/with-query-results* ["select * from users order by username asc"]
      (fn [row] (println "User" (row :first_name) (row :last_name))))))

彼此彼此。

4

1 回答 1

2

嗯,这很尴尬......事实证明,相对较差的性能是由于将我的测试代码作为简单 Web 应用程序的一部分运行(我知道,这在这个问题的上下文中没有意义),我我猜想它与使用它运行lein ring server它是一样的repl(我只是没有建立那种连接)。当我尝试用 编译和打包lein uberjar然后用 执行该 jar 时java -jar,它给了我与 Java 应用程序相当的性能。

于 2012-11-19T09:37:40.597 回答