クリエモンでは、.NETの、DataReader系を使用した独自の永続化層を作って、MySQLへアクセスしてたんですが、ちょっと他のプロジェクトで使い回せるようなカタチになってなかったり、NoSQL系に興味が出てきたりしたので、別のやり方を模索しています。
FaceBook、Twitterなどの大手が採用しているCassandraと、Monoでも問題なく使えるオブジェクトデータベースdb4oが気になっていたので、今回はdb4o(ver7.4)を軽く調べてみました。
特徴
- オブジェクト自体を検索条件として使える
- より詳細なクエリも発行出来る構文もある
- Linqでデータを取ってくることも可能
- インデックスも使える
- トランザクションもある
- サーバ側も基本的には自分でコードを書く必要あり
- レプリケーション可能、2台まで?
- レプリケーションは、双方向も可能
- クラスターは実装中ぽい
- MySQL的なデュアルライセンス
オブジェクトデータベースということで、カラムとフィールドのマッピングが不要だったり、クエリもSQL不要だったりで、コードの記述量はかなり少なくて済む印象。Javaと.NETのみをターゲットにしていて、LINQにも対応するなど、かなり.NETと親和性は高めに感じました。
ただ、組み込み用途を主に意識しているようで、Webでの使用は若干の不安もありそう。レプリケーションは可能で、コードから設定するんだけど、2台までしか指定できなくなってます。ただ、2台のレプリケーションの設定をいくつも書けば、もっとたくさんでのレプリケーションも可能なのかも(未調査)。双方向のレプリケーションが可能なのはいい感じ。要するにマルチマスタで、コンフリクト時は、自分でイベントハンドラを書いて解消する仕組みになってます。クラスターっていうのもあるみたいだけど、まだ実験段階かな。
速度面は、PolePosition benchmarkっていうのを見たら、かなりパフォーマンスがいいってことだったけど、実際、Wikipediaの日本語記事データを70万件くらいインサートしてみたら、MySQLの方が速かったです。オブジェクトのネストが浅かったからですかね。
1項目インサートするごとに、ネットワークを繋ぎ直していたのが遅くなっていた原因でした。一度使ったコネクションを使い舞わすようにしたところ、驚くほどInsertがパフォーマンスアップしました。体感ですが、MySQLの数倍速いと思います。
総合的にみて、db4oはコードが簡潔に書けて非常に使いやすいですが、Webで大規模に使うには、まだちょっと不安が残るかなという感じをうけました。組み込み系を作るときは、ぜひ使ってみたいプロダクトですね。クリエモンで使うかどうかは、Cassandraの方も評価してみて、最終的な判断をしようと思います( ̄∇  ̄ )