はじめに
OrientDBを使用していてよかったところとイマイチなところが結構見えてきたので、イイところ悪いところをつらつら書きます
イイところ
Javaでできている
Javaでできているので、基本的にはプラットフォームに依存せずに環境を構築できる。
使用するメモリサイズなどもVMで調整ができる。
1. Luceneが使える
文字列の検索のための索引を、Luceneで作ったアナライザで作ることができ、検索もLuceneベースで行える。
2. グラフDBとして使え、ドキュメントDBのように柔軟
グラフ理論に基づく検索が可能。
テーブル定義を決め切らなくてもデータの挿入が可能。
3. データ操作するためのAPIが豊富
JavaでできているのでJavaAPIとの親和性は高いと思われます。
4. Gremlinが使える
グラフDBを標準的に扱うためのApache TinkerPop Gremlinに対応しているので、ほかのグラフDBと同じインターフェースを使って実装が可能。
5. メモリモードがある
メモリモードでDBを作成すると、DBインスタンスを突発的に作成することができる。
DBのサービスを落とすと消えるので、
単体テストとかに使える!!
6. Dockerがある
Dockerが用意されているので、Javaのバージョンとかを気にせずに環境構築が簡単にできる。
単体テストに使用しやすい!
マスターシステムではTravisCIで単体テストをする際に、Dockerで起動し、メモリモードのDBを作ってテストしています。
https://hub.docker.com/r/library/orientdb/
イマイチだったところ
1. マイナーバージョンのリリースがめちゃくちゃ早い
バージョン
3.0系
内容
http://orientdb.com/download-previous/
↑のページを見てわかる通り、月に2,3回バージョンが上がります。
バグが治っているのはいいことですが、追従していくにはかなりつらいと思います。
2. メモリ不足で落ちると復活しない
バージョン
3.0.8
内容
大量のレコードを検索した際にメモリ不足でOutOfMemory
が発生すると、その後、Insert
を行ったりしようとすると、同じくOutOfMemory
で Insert
できない。
あと、Studioで大量のレコードを検索するSQLを実行して、OutOfMemory
が発生すると、レスポンスが返ってこず、操作できなくなる。
Java VMのヒープ領域の指定は起動スクリプト(server.batやserver.sh)内にありますが、2GBが初期値で入っているので、調整するにもここを修正する必要がある。
3. バックアップのリストアをすると、独自のLuceneインデックスが壊れる
バージョン
3.0.8
内容
バージョン変更を行う際に
- 旧DBの停止
- 旧DBのバックアップの作成
- 新バージョンのDBをインストール
- 新DBの環境設定
- 旧DBのバックアップを新DBへリストア
D6. Bのサービスを起動する
の手順でバックアップをリストアしたときに、バックアップに含まれるインデックスが壊れ、Insert
などをしようとすると、例外が発生してデータの操作ができなくなる。
REBUILD INDEX
すると解消するが、これも環境次第では結構時間がかかるので嫌ですね。
4. JavaAPIで書き込んでコミットしたはずがデータが登録されていないことがある
バージョン
3.0.8
内容
MDMの書き込みAPIで発生しますが、
POSTして、登録されたはずのデータが、GETしても取得できない時があり、DBにSELECT文を投げてみても取得できないことがある。
DB起動して最初のリクエストで起きやすいような感触です。
5. JavaのランタイムはJAVA_HOMEを見ている
バージョン
3.0.8
内容
Javaなので当たり前といえば当たり前ですが、JAVA_HOME環境変数をみて実行されます。
開発しているアプリケーションがJava10だったりすると、同一マシン上でOrientDBを動かしたりしたい場合には少し面倒。
違うバージョンのJavaで起動してしまうと、インデックスのリビルドをするときにエラーになったりする。
起動スクリプト内でJAVA_HOMEを参照して実行しているので、使用したいJavaのディレクトリに書き換えるなどするとよいかもしれません。
6. 検索がまあまあ遅い
バージョン
3.0.8
内容
Luceneクエリなどを使って検索をすると、まあまあ時間がかかります。
例はMDMのAPIのItemSourceのSearchです。
7. 悲観ロックできない
バージョン
3.0.8
内容
RDBMSなどであるようなSELECT FOR UPDATE
みたいな機能は実装されていない(TODOにはなっている)。
悲観ロックできないので、トランザクション単位でのロックが難しく、処理フローなどを考慮しておかないと不整合が起きやすいかもしれないです。