Hunchentoot と Elephant の CLSQL バックエンド を使うとき
DB 接続がクローズされなくて泣く。 Elephant のバージョンは Elephant 1.0 Alpha 2 (January 15th, 2008)。もしかしたら開発バージョンの Elephant ではなおっているかもしれないけど未調査。
そういえば Weblocks では CLSQL-Fluid が使われていたな。
そんなこんなで次のようなコードを書いて対応した。
(defclass my-acceptor (hunchentoot:acceptor)
((lock :initform (bt:make-lock))))
(defmethod hunchentoot:process-connection :around ((self my-acceptor) (socket t))
"Elephant はスレッド毎に DB の接続をオープンするが、それをハッシュテーブルに保持したままクローズしようとしない。
Hunchentoot はリクエスト毎にスレッドを作って使い捨てている。
ということで、リクエストが完了した時点で DB クローズ行うようにする。"
(unwind-protect
(call-next-method)
(bt:with-lock-held ((slot-value self 'lock))
(let* ((dbcons (db-clsql::controller-db-table elephant:*store-controller*))
(db (gethash (bt:current-thread) dbcons)))
(when (db-clsql::connection-ok-p-con db)
(clsql-sys:disconnect :database db))
(remhash (bt:current-thread) dbcons)))))
;; start
(hunchentoot:start (make-instance 'my-acceptor)