昨今のJava向けのオープンソースなオブジェクトデータベース
そういえば、前のエントリでオブジェクトデータベースについて書くと宣言してから、気づけば一ヶ月半以上経っていました。
そろそろ書いとかないと、イケメンタップダンサー兼プログラマのNAGASEYASUHiTOに怒られるので、書きます。
基本的にJava向けの実装があるものしか知らないし(PythonとかSchemeにもあるよね)、オブジェクトデータベースのプロでもなんでもないんで、間違いがあるかもしれません。
オブジェクトデータベースに関する情報を見つけたら、僕はlivedoor クリップにTag: ODBMSでクリップしてるので、オブジェクトデータベースに興味のある人はここを購読するといいかもしれません。
- Java向けのオープンソースなオブジェクトデータベースにはどんなものがあるのか
- どれがイケてる?
- MyOODBの特徴
- NeoDatis ODBの特徴
表を作ると
| 名前 | ライセンス | 標準準拠とか | 活発度 | その他の言語 |
|---|---|---|---|---|
| db4o | GPL/オープンソースプロジェクト用/商用 | JDOとは繋がるらしいよ | 活発っぽい | .NETとか |
| MyOODB | GPL/LGPL | 標準なんて関係ねえ | 1人なのにめっちゃ活発。2008/02/08に最新リリース。 | Jython/JavaScript/C++(予定) |
| EyeDB | LGPL | ODMG 3 | 2006/10/06以降リリースなし | なし |
| ozone | GPL/LGPL | ODMG 3 | 2005/11/26以降リリースなし | なし |
| Perst | GPL/商用 | ODMG 3 | 2006/10/06以降リリースなし | C# |
| Orient ODBMS | Apache 2.0 | ODMG 3/JDO 1.0 | 製作者がJDOのExpertGroupのメンバだったりするんだけど、その人がRomaってフレームワークに注力してて、結果2004/08/06以降リリースなし | C++ |
| JDOInstruments | LGPL | JDO | 2006/12/08以降リリースなし | なし |
| NeoDatis ODB | LGPL | 標準なんて無視 | 活発。2008/02/12に最新リリース。 | .NET(予定) |
| Ener-J | GPL | ODMG 3/JDO 2.0 | まだリリースなし。最終コミットが2007/07/25 | なし |
表見てのとおりなんだけど、まずライセンス的に厳しいのが多い。
恐らく一番名前が売れていて、実績があって、機能も豊富で、性能もよくて、扱いやすいのがdb4oなんだけど、db4oは商用で使うには金が掛かる。
オープンソースプロジェクト向けの新しいライセンスとか作ってるけど、あんまり意味ないっぽい。
ScalaによるWebアプリケーションフレームワークであるLiftが、MLでdb4oをそのライセンスで組み込もうかとか相談してたけど、なんか色々制約あるっぽいってことでやめてたな。
MySQLみたいなリレーショナルデータベースは、GPLであっても直接そのAPIを叩くわけじゃないから商用でも使えるという解釈っぽいけど、オブジェクトデータベースは直接そのデータベースのAPIを叩くので、使う方もGPLにしなきゃいけないらしい。
というわけで、上表でGPLのやつは軒並みアウト。GPL/LGPLなものは、ソースコードに手を入れた場合はGPL適用だけど使うだけならLGPL適用だから商用もいいよって感じ。
次に、開発の活発さがまた問題。
オブジェクトデータベース自体が長いこと冬の時代を送っていたこともあってか、活発だといえるのはdb4o, MyOODB, NeoDatis ODBぐらい。
最後に、標準準拠について。
ODMG 3とか、誰も知らないよね。ってかむしろ準拠してると設定ファイルとか必要になったりでめんどいだけ。
JDO準拠はいいかもしれんけど、最高のJDO実装であるJPOXでさえ最近JPAにも準拠しちゃったぐらいだし、JDOであることのメリットってもうないかも。ってか、JPOXすごいな。
まあ、そういうわけで標準準拠とか気にしなくてよし。
となるとね、残るのってMyOODBとNeoDatis ODBだけなのよ。
というわけでこの両者について紹介します。
このオブジェクトデータベースは、すごい。
何がすごいって、開発者が一人だけなのにカバーしてる機能が多く、言語も多いこと。
上表にもあるとおり、JavaだけじゃなくてJythonやJavaScriptからもオブジェクトデータベースを扱える。
JavaScriptから直接だよ?もちろんAjaxみたいに非同期にもクエリできる。
さらにそのうちC++から扱えるようになる予定。
機能も半端ない。
オブジェクトデータベースにしては珍しく組み込みモードがなくてクライアント/サーバモードだけなんだけど、その通信もHTTPだけじゃなくてHTTPSはもちろんTCP/TCPSプロトコルでもいける(って書いてあるけどレイヤーが違うような)。
MyOODBが管理するオブジェクトはサーバにしか存在せず、クライアントが操作するのはその参照(Proxy)にすぎないため、複数同時のネストしたトランザクションなんてのも扱える。
DBの自己回復機能や汚染分離機能などもある。
自称だけど最速のオブジェクトデータベースらしい。検証データはない。
もちろん欠点もある。
まず、ドキュメントがまったくない。「ドキュメント?サンプル嫁」が基本スタンス。
さらに、少なくとも僕の環境ではそのサンプルもそのままじゃ動かせず、バッチファイルにクラスパスを追加してやる必要とかがあった。
さらに、使うにしても、まずモデルをJavaクラスとして定義し、そのクラスを引数にJythonスクリプトを実行して、MyOODB用のクラス(Proxyクラスとか)を2つ作ってやる必要がある。
あ、Javaのときの話ね。JythonとかJavaScriptから使うときにどうするかは知らない。
まとめると、玄人好みの渋い奴って感じ。
こちらは、実はしばらく開発中断してたんだけど、2007年後半ぐらいから活発に活動再開したんだよね。
MyOODBとは違いこちらは会社が中心となって開発してる模様。
現在はJavaだけだけどそのうちC#.NETからも扱えるようになる予定。
NeoDatis ODBのいいとこは、とにかく扱いやすいこと。
格納するオブジェクトは特に何かのインタフェースを実装する必要も何かのクラスを継承する必要もないただのPOJOでいい。
さらにドキュメントもPDFで丁寧なのがついてくる。英語だけど読みやすいよ。
jarファイル一個入れるだけってのもお手軽でいい。
さらに、データベースブラウザツールまでついてくる。ただし日本語だとところどころ文字化けするけど。
パフォーマンスもそこそこみたい。
検証データもあって、オブジェクト数が多すぎないうちはdb4oとパフォーマンスがほとんど変わらない。
オブジェクト数が多くなったときのパフォーマンスの低下の仕方がちょっと気になるけど。
クエリに関しても、db4oで言うとこのNativeQueryって奴が使える。
どういうことかというと今流行の流れるようなインタフェースみたいな感じ。
odb = ODBFactory.open(ODB_NAME);
IQuery query = new SimpleNativeQuery() {
public boolean match(Player player) {
return player
.getFavoriteSport()
.getName()
.toLowerCase()
.startsWith("volley");
}
};
Objects players = odb.getObjects(query);
いわゆる流れるようなインタフェースによるクエリだと、どうしてもフィールド名を文字列で書く必要があるみたいだけど、こちらは、そのままそのクラスのgetterメソッドを呼べばいい。
これがオブジェクトデータベースのいいとこだよね(ただしこういうクエリが出来るのはdb4oとNeoDatis ODB以外知らない)。
こちらは、MyOODBとは違い、組み込みモードも対応してる。また、HTTPによるクライアント/サーバも対応。
ただし、ネストしたトランザクションとかそういうことは出来ない。
Index張ったりとかもできるけど試しにやってみたことがある程度なので効果がどれぐらいかはしらない。
あーちなみに、MyOODBもNeoDatis ODBも両方ともDBの中身をXML形式でimport/exportすることができる。
まとめると、初心者でも安心の可愛い奴って感じ。
是非、オブジェクトデータベースも試してやってくださいな。
試すなら、NeoDatis ODBとMyOODBがお勧め。
とくにJavaScriptからMyOODB使うのを試すなんてかっこいいよね。Jythonから使うの試すとか猛者だよね。
まあ、そこまでしなくても、NeoDatis ODBなら手軽に試せるから是非どうぞ。