clojure向けの組み込みデータベースの選定
今回は、「clojureから使える組み込み型データベース」をリストアップし、その中から自分の用途に合ったものを探し出した。
なんで必要か
これまでの流れ
毎月2回、試作ゲームを作って公開するという事となった
二月後期の試作ゲームを作る必要がある。どんな内容にする?
二月後期の試作ゲームは、これまで作るのを避けていた「サーバサイドでデータを保持する、オンライン要素を持つゲーム」と決まった
なんで、これまで避けていたのかというと、オンラインゲーの宿命として「サービス終了したら遊べなくなる問題」がある為
- これは大手だけの話じゃなく個人開発でもそうで、サーバサイドの要素を持たないブラゲであれば、仮に提供サーバのメンテがされなくなったとしても、ブラウザからロードできるファイル一式をサルベージできれば、そのゲームを他のサーバ等に設置して遊ぶ事はできる。ここでもしサーバサイドの要素がある場合、サルベージは絶望的になる。
- 今回オンラインゲーを作るにあたって、この問題をどうにかしたい
上記について考えた結果、以下のような結論となった
- 「httpサーバ込みのuberjarを作れば、サービス終了後でもjarを配布する事で、一応遊べる事が保証できる(セーブデータの別サーバへのエクスポート/インポートについては各ゲーム側での対応としたい)」
上記の対応の際に問題になるのは、データストレージ部
まず最初にdatomicを検討した
- 無償版でもローカルファイル書き出しができ、再配布も可能という事で最有力候補として試していたのだが、ライセンスをよく見るとなんか複雑で、将来に運用方針を変更(例えば、有料販売する等)した際にも使い続けられるか非常に不安があるので、とりあえず今回は見送る事にした。有償版ライセンスを買える金はない。
そういう訳で今回は、「組み込み型データベース」の候補をリストアップし、その中から自分の用途に合うものを選ぶ事にした。
- 本当は、実際に使ってみた結果等も含めて記事にするつもりだったが、量が結構多くなったので、一旦ここで分ける事にした
選定条件
外部プロセスを起動しない、いわゆる「組み込み型」のrdbms/kvs/nosql/dbmの類である事
ライセンス回りの確認
- 無償もしくはごく安価で使える事
- 生成したバイナリ(jar)の再配布ができる事
- ソース開示条件が付いてない事(要はGPL系不可)
SQLはもううんざりしているので避けたい
実際のデータストレージ先は、ローカルファイル1~3個ぐらいであるのが望ましい
- オンメモリのみ(プロセス終了→再起動でデータを引き継げないタイプ)は不可
- ディレクトリ掘って大量にファイルを生成するタイプのも避けたい
扱いが簡単である事。複雑な操作が必要なものは筆者の手には負えないので不可
候補
clojureで自作
- 自作する場合は、品質を上げる為に結構な時間が費されると予想
- このデータベース系は、自分が頑張って作りたいジャンルのものという訳ではないので、自作せずにすませて自分の時間を節約すべき、という結論になった
datomic free edition ( http://www.datomic.com/ )
- 既に書いたが、ライセンス面での不安があるので今回はパスする事に
- 公式サイトを見ると一見、無償版でもjarをダウンロードしないと使えないように見えるが、clojarsにも一応登録されていた( https://clojars.org/com.datomic/datomic-free )。ただ、これが公式なものかはよく分からない。公式なものだったら公式サイト側にも記載があってよさそうなものだが…。
kyoto cabinet ( http://fallabs.com/kyotocabinet/ )
- これも良い候補だったのだが、ライセンスがGPLか商用ライセンスなので、今回は見送り
neo4j ( http://neo4j.com/ https://github.com/neo4j/neo4j )
- 面白そうな感じだが、ライセンスがGPLという事で今回は見送り
HyperGraphDB ( https://github.com/hypergraphdb/hypergraphdb http://www.kobrix.com/hgdb.jsp )
- neo4jと同ジャンルらしい。これもライセンスがLGPLという事で今回は見送り
berkeley db java edition ( http://www.oracle.com/us/products/database/berkeley-db/je/overview/index.html http://docs.oracle.com/cd/E17277_02/html/index.html )
- これもGPLと商用ライセンスなのでパス
leveldb ( http://leveldb.org/ https://github.com/google/leveldb )
touchdb ( https://github.com/couchbaselabs/TouchDB-Android )
mapdb ( http://www.mapdb.org/ https://github.com/jankotek/mapdb )
java.util.Map
をインターフェースとしてデータをストレージする、dbmっぽい感じのライブラリ- これがよさげ。試してみる
- 参考記事
後日、mapdbを試した結果を別記事として書いた。