ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

オブジェクトデータベースdb4oをちょっと調べてみた

Monday, 15 March 2010 14:44 by sabro

クリエモンでは、.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の方も評価してみて、最終的な判断をしようと思います( ̄∇  ̄ )

Tags:   , , , ,
Categories:   NoSQL
Actions:   Permalink | Comments (39) | Comment RSSRSS comment feed

monorail-RC3 が mono1.2.4上で動いた

Sunday, 21 September 2008 07:52 by sabro

複数のエラーが複雑に絡み合って大変でしたが、とりあえずDBからデータをとってきて、それをページに表示するところまで来ました。まだ、画像が一部表示されなかったり、おかしな部分もありますが、まあなんとかなるかな。

とりあえず、ハマッタ部分を列挙しときます。

1.AspView上でのViewComponent
MonorailのViewEngineの一つ、AspViewを使っているのですが、このエンジン上でViewComponentを使う時は引き渡す値がNullだといけないようです。たまたまNullを渡してしまうロジックがあったので、空のオブジェクトをデフォルトで生成しておくよう修正しました。
2.MysqlDataReader.GetValueの仕様
MysqlDataReader.GetValueで、DBの値をオブジェクトとして取得したものを、リフレクションでオブジェクトのフィールドにセットしていたのですが、その際実行される暗黙的キャスト処理が、Windows上では動作するがMono上では動作せず「Unknown target conversion type」とエラーが出ていました。これはメチャクチャ嵌ったんですが、MysqlDataReaderのドキュメントを見ると、以下のような文が書いてありました。
For optimal performance, MySqlDataReader avoids creating unnecessary objects or making unnecessary copies of data. As a result, multiple calls to methods such as GetValue(Int32) return a reference to the same object. Use caution if you are modifying the underlying value of the objects returned by methods such as GetValue.
どうやら、DBから同じ値を取得した場合、2回目は前回取得した値の参照を返すようで、おそらくこれのせいでキャストが失敗したのではないかと考えています(あくまで予想です)。対策として、データを取得する際、明示的にGetStringやGetInt32などを使用することで回避できました。
3.Enumのフィールドにリフレクションで値セット時の挙動
前述のとおり、DBからとってきたデータは、リフレクションでオブジェクトのフィールドにマッピングしています。Enumフィールドに対してDBの数値型のカラムから取得した値をセットした場合、Windowsでは問題なくキャストしてくれるのですが、Monoではエラーになっていました。Enum.ToObjectを使用してリフレクションの前にEnumオブジェクトに変換しておくと、うまく動作しました。まあEnumに数値を割り当てる時は通常はキャストが必要なのでこれは仕方ないかもしれません。
4.フォルダ名の大文字、小文字
Windows上で正しく動作しているからフォルダ名の大文字、小文字は気にしてなかったのですが、Linuxでは当然これらを区別するので、プログラムから指定するパスと実際のディレクトリが正確に一致していないと、ファイルが見つからないことになります。javascriptが入っているフォルダが見つからないなーと思ったらこれが原因でした。
5.AspViewのディレクトリ区切り文字列
ViewEngineのAspViewがSubViewのあるディレクトリを探す際に、環境に合わせた区切り文字を取得できるPath.DirectorySeparatorCharを使わず、"\"をディレクトリ区切り文字列として使用していました。これでは当然Windowsでしか動きません( ̄□  ̄ || 作者のブログに慣れない英語でコメントしてみたのですが、Mono環境を持ってないのでテストできないそうです。逆によかったらパッチを送ってくれと頼まれたのですが、Sabroが使っているのはMonorail-RC3に会わせた少し古いバージョンでTrunkとはかなりクラス構成が変わっています。一応Trunkのものを持ってきて動かそうと試みてみたのですが、別のエラーが出て動作するところまでいきませんでした。そこで、申し訳ないですがパッチは送らずに、ローカルでソースを修正して使うことにしました。作者さんすいません m(_ _)m

やっぱ、まだMonoは色々問題あるなぁ。まあ半年の努力が無駄にならなくてよかったよかった(・∀・)

Tags:   , , ,
Categories:   .NET
Actions:   Permalink | Comments (52) | Comment RSSRSS comment feed

monorail on mono でハマりまくる ( ̄□  ̄ ||

Friday, 19 September 2008 15:45 by sabro

monorailで作ってるセカンドライフ向けのWebサービスだけど、当然WindowsServerなんか使うお金はないので、Linuxサーバのmono上で動作させる予定だったのです。

まあ、.NETは中間言語にコンパイルされるし、VisualStudioで開発したものも、どうせ動くっしょとタカをくくって今まで動作確認してませんでした。しかし、開発も終盤にさしかかったので、昨日ホイッとmono1.2.4上にデプロイしてみたら、なんとエラーでまくりでした ( ̄□  ̄ ||

まず、変数をキャストする際に、Unknown target conversion type というエラーが出てたのですが、これはMySQLのドライバ(connector/NET)が新しすぎたことが原因だったみたいでした。5.1系だったのを、1.0系にしてやれば、それは直りました。(追記:これは勘違いだったみたいで、MySqlDataReader.GetValueを使用していたのがダメだったようです。型を判別してGetStringとかを使えば直りました。ドライバも5.1系でOKでした

次は、CreateSemaphore という処理で謎のエラーが・・・。これは、Bug #33682を見ると、なんとコネクションプーリング用のセマフォを取得するのに、Win32APIを直接叩いているとのこと。なんだその作りは orz
パッチがあるようですが、とりあえずPoolingをオフにして先に進むことにしました。

そして、ようやくMySQLドライバがらみのエラーは消えたようですが、今度はエラーになってもスタックトレースが表示されず、ApacheのInternal Server Errorの画面しか返ってこなくなりました。とりあえず疲れたので続きは明日。

これで動かなかったら、これまで半年開発してきた努力が全て無駄になってしまうのだが・・・大丈夫なのか (-_ - ||

Tags:   , ,
Categories:   .NET
Actions:   Permalink | Comments (48) | Comment RSSRSS comment feed

CentOS 5 がリリースされてた

Thursday, 19 April 2007 16:25 by sabro

自宅サーバ に使用している、OS の最新バージョンである、CentOS 5 がリリースされていました。

個人的には、Apache が、2.2系になったことと、MySQL が、5.0系になったことがウレシイです。

mod_proxy_ajp で、やっと、mod_jk のメンドくさいコンパイル作業から、開放されますね。

Tags:   , ,
Categories:   Linux
Actions:   Permalink | Comments (45) | Comment RSSRSS comment feed

OSC2007へ行ってきました(1日目)

Friday, 16 March 2007 17:12 by sabro

オープンソースカンファレンス2007へ、行ってきました。いろいろ、刺激になることがあって、面白かったです。

せっかくなので、受講したセッションの感想などを、書いておこうと思います。

オープンソースでSOAを実現するJBossミドルウェア 
SOAの概要とか、基本部分の説明が結構多かった。この講義を、聴きに来る人は、SOAについて、大抵分かってるだろうから、もうちょっと、はしょっても良かったんじゃないかな。サポートでプログラマを派遣してくれるらしいけど、このあたりは、やっぱりキチンとした製品という感じで、好印象だった。jBPM とか、JBoss Rules とか、よく知らない機能が増えていたけど、個人で使うには、すこしオーバースペックかな。
サービス部会の活動のご紹介とOSSサービスの現状と今後について 
受講者4人でした・・・。サービス部会というのが、よく知らなかったんだけど、OSSを作る側の視点に立って、コンサルティングサービスや、サポートサービスなどを、どう組み合わせればビジネスになるか、ということを考える会らしいです。 資料中のデータは充実してました。
MySQL+Senna による全文検索 
多分、今日一番熱かったセッション。Senna というモジュールを使えば、MySQLで全文検索が可能になるみたいです。TEXT 型とかに、インデックスが作られる訳だけど、特に意識して作成しなくても、普通に INSERT とかすれば、勝手に作ってくれるようで、なかなかお手軽感がありました。パフォーマンステストでは、Wikipedia の記事、1.4GBに対して、検索のパフォーマンスが、LIKE 句の、約1万倍(スゴイ)で、更新パフォが、0.5倍弱らしいです。ただ、今のところ MyISAM のみの対応であったり、普通のインデックスと、フルテキストインデックスの同時使用が、不安定だったりして、導入には、まだ早いんじゃないかという印象も受けました。
XOOPS / XOOPS Cube活用事例~XOOPSを活用した新CMSの開発
XOOPS Cube の活用事例というようりは、XOOPS を拡張して作られたという、NetCommonsの解説が、メインでした。NetCommonsは、自分だけが見れるマイページ、同一グループのみが見れるグループページ、誰でも見れるページと、3種類のページを使い分けれる点が特徴で、主に公共機関などで使われているらしいです。今のところ、知名度は低いですが、これから、伸びてくる可能性のある、面白いCMSでした。
Apache Geronimoってなんだ? 
講師が、最初に受けたJBossのセッションと、同じ人だった(節操ねぇ~)。Apache Geronimoは、BSDライセンスのプロダクトを組み合わせた、面白いアプリケーションサーバですが、やはり、オーバースペック感がありました。大規模開発で使うなら、結構面白そうなプロダクトだと思います。

以上、1日目の感想でした。明日も参加するので、また書こうと思います。

Tags:   , , , , , ,
Categories:   その他
Actions:   Permalink | Comments (138) | Comment RSSRSS comment feed