1

以下程序从 ü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

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

4

2 回答 2

1

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

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

于 2013-08-13T09:07:12.730 回答
0

使用datomic.api/shutdown

关闭

功能

用法:(关闭关闭-clojure)

关闭所有对等资源。此方法应作为 JVM 进程干净关闭的一部分调用。将释放所有连接,如果 shutdown-clojure 为真,将释放 Clojure 资源。如果用 Clojure 编写的程序在 Datomic 之外管理 Clojure 资源(例如代理),则可以将 shutdown-clojure 设置为 false;用其他 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)))
于 2016-03-23T14:20:44.067 回答