【问题标题】:Cannot understand SQLException exception in clojure无法理解 clojure 中的 SQLException 异常
【发布时间】:2012-04-10 07:06:32
【问题描述】:

我已经创建了一些clojure函数来访问数据库,如下面的sn-p所示:

(defn get-dg [date]
  (let [query (str "......")
        ]
    (jdbc/with-connection db
      (jdbc/with-query-results rows 
          [query date date date date]
          (.debug log rows)
          (if (not (seq rows)) 
           nil
           rows))))
)

一切正常。该查询返回一个结果集,然后我可以对其进行处理。现在,如果我注释掉(.debug 日志行),我会得到:

java.lang.RuntimeException: java.sql.SQLException: Closed Resultset: next

知道为什么吗?

谢谢

【问题讨论】:

    标签: jdbc clojure


    【解决方案1】:

    我不是 100% 确定,但我想问题在于,结果 seq 是惰性的,并且在您处理它时,数据库连接已关闭(您在 with-connect 之外)。

    您的调试语句会在连接仍处于打开状态时强制实现。

    一些小的文体cmets:

    您不必使用 str 将字符串转换为字符串。

    if not seq 的东西,可以简化为:

    (if (seq rows)
        rows)
    

    (或者甚至只是rows,如果它只能是一个seq或nil无论如何)

    【讨论】:

      【解决方案2】:

      “行”是懒惰的。而且似乎“(.debug log rows)”评估了“rows”。明确地这样做:

      (defn get-dg [date]
        (let [query (str "......") ]
          (jdbc/with-connection db
            (jdbc/with-query-results rows [query date date date date]
              (comment .debug log rows)
              (if (empty? rows) nil (doall rows))))))
      

      【讨论】:

      • 感谢您的回答。我怀疑懒惰的评估可能是原因。显然,(.debug) 强制序列评估。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2011-06-15
      相关资源
      最近更新 更多