【问题标题】:Simple(st) Datomic test program hangs at exit简单(st)Datomic 测试程序在退出时挂起
【发布时间】:2013-08-12 03:32:59
【问题描述】:

以下程序从 überjar 运行时,仅在使用内存中 Datomic 数据库时才退出;当连接到 Datomic 服务器时,它会无限期挂起而不是退出 JVM:

(ns myns.example
  (:use [datomic.api :only [db q] :as d])
  (:gen-class))

;; WORKS: (def uri "datomic:mem://testdb")

(def uri "datomic:free://localhost:4334/testdb2")

(defn -main []
  (println 1)
  (when (d/create-database uri)
    (d/connect uri))
  (shutdown-agents)
  (println 2))

运行方式:

lein uberjar && java -cp target/myns-0.1.0-SNAPSHOT-standalone.jar myns.example

输出:

1
2

然后挂起。只有在程序启动时数据库不存在时才会挂起。

有人知道为什么,或者如何解决吗?这适用于datomic-free-0.8.4020.26datomic-free-0.8.3941

UPDATE -- 上述程序确实终止了,但需要很长时间(> 1 分钟)。我想知道为什么。

【问题讨论】:

  • 你试过(d/release conn)吗?
  • 试过了,没有明显区别——但我在这个过程中了解到,上面的程序最终会终止,只需要一分钟多一点(!!!)。

标签: clojure datomic


【解决方案1】:

shutdown-agents 最多需要一分钟才能完成(假设没有代理正在运行操作)。

这是由于java.util.concurrent 缓存线程池的工作方式。

【讨论】:

  • 谢谢!无论我是否打扰shutdown-agents,该程序都需要一分钟左右才能完成。知道为什么吗?
  • 我猜 Datomic 正在调用它?不是这样,那么程序将永远挂起......
  • 谢谢,考虑到 1 分钟的时间刻度相匹配,我认为这是公认的答案,尽管我不明白删除 shutdown-agents 时关闭是如何发生的。
  • 我可能完全错了 - 时机只是巧合。尝试休眠 30 秒,然后发送代理打印一些值。如果成功,则不涉及shutdown-agents。
【解决方案2】:

使用datomic.api/shutdown

关机

功能

用法:(shutdown shutdown-clojure)

关闭所有对等体 资源。此方法应作为干净关闭的一部分调用 一个JVM进程。将释放所有连接,并且,如果 shutdown-clojure 是真的,会释放 Clojure 资源。用 Clojure 编写的程序 如果他们管理 Clojure 资源,可以将 shutdown-clojure 设置为 false Datomic 之外的(例如代理);用其他 JVM 编写的程序 语言通常应该将 shutdown-clojure 设置为 true。

在 Datomic Clojure 版本 0.8.3861 中添加

(ns myns.example
  (:require [datomic.api :as d])
  (:gen-class))

(def uri "datomic:free://localhost:4334/testdb2")

(defn -main []
  (d/create-database uri)
  (let [conn (d/connect uri)]
    (try
      ;; do something
      (finally (d/shutdown true)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多