日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

Datomic transactor に接続できなくなった?

Datomic でトラブルらしきものに初めて遭遇した。

datomic-pro-0.9.4324 の dev プロトコル transactor を自分の PC に立ち上げっ放しで
Emacs cider REPL から接続しようとするといつもならすぐ接続できるのに今日は何故か接続できず
中断すると以下の例外が出た。

CompilerException clojure.lang.ExceptionInfo:
Error communicating with HOST localhost on PORT 4334
{:host "localhost",
 :alt-host nil,
 :port 4334,
 :username "...",
 :password "...",
 :timestamp 1386667907524,
 :version "0.9.4324",
 :encrypt-channel true},
compiling:(form-init9067491083327435996.clj:1:10)

見易いよう適当に改行して :username, :password は暗号化はされてるっぽいが何となく消してはいる。
jack-in で起動した nREPL クライアント/サーバ込みで Emacs を再起動したが変わらず。

transactor 側を再起動させりゃ多分繋がるんだろうけど、
すぐそれをやるのも何だか味気ないのでデフォルトで記録されるログを見てみる。

2013-12-10 18:07:11.813 WARN  default    o.h.c.p.c.i.RemotingConnectionImpl - Connection failure has been detected: 
Did not receive data from /127.0.0.1:59797.
It is likely the client has exited or crashed without closing its connection, 
or the network between the server and client has failed.
You also might have configured connection-ttl and client-failure-check-period incorrectly. 
Please check user manual for more information. The connection will now be closed. [code=3]

エラい細かく書かれてますなw

どうも前の接続が閉じられる前に強制終了させたのがマズかったのかな?確かにタスクマネージャで Emacs 経由で起動した java.exe を終わらせた気はする。

transactor って起動しとかなくても動く?

これに対応してるときにふと思いついたのだが、

Datomic Development Resources

アーキテクチャ見てると実は transactor ってなくても動くんじゃね?とかと思って
今度はワザと transactor を終了させて Emacs cider REPL から繋いでみようとしたが

(def con (d/connect uri))
; => CompilerException java.util.concurrent.ExecutionException: 
;    org.h2.jdbc.JdbcSQLException: データベースはすでに閉じられています 
;    (VM終了時の自動データベースクローズを無効にするためには、db URLに ";DB_CLOSE_ON_EXIT=FALSE" を追加してください)
;    Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL)
;     [90121-171], compiling:(form-init9067491083327435996.clj:1:10) 

やっぱダメすか。