Hatena::ブログ(Diary)

スティルハウスの書庫 このページをアンテナに追加 RSSフィード

2009-08-30

Datastore Low level APIのわかりやすいまとめ

#appengine JavaのLow-Level API(低レベルAPI)入門

shin1ogawaさんの大変ありがたいまとめ! 英訳してGoogleのApp Engineドキュメントに掲載してほしいくらいですね。

個人的な思いとしては、GAE/JのDatastoreについてJDOから入るのは間違いの元だと思ってるんで、
JDOから入るとどーしてもRDBのORMだという認識が頭から抜けずにはまる人が多いよぅに思うんですよね。

確かに。。間違いとまでは言わないけど、インデックスやスキャンとか理解せずにHibernate感覚で使い始めるとはまりそうですね。あとApp EngineのJDO実装に対して感じるのは、

  • 白鳥が水面下で必死に水かきしている感がある:owned関係の子を10000くらいに増やしたり、Queryで1000件以上取ったりするとかなり遅くなるなど
  • この間のbp studyで白石さんとも話したけど、JDOはAPI自体がちょっと古いし、Python版やRailsと比べて回りくどい感は否めない
EntityGroupといっても、結局「エンティティのKeyが親を持つか?持たないのか?」という事でしか無いのです。
また、JDOを使って書き込みを行っている場合は、楽観的排他制御やListPropertyのインデックス等の制御をする為にJDOが独自に付加した属性が存在していたりします。

なるほど〜、ということは、Low-level APIだけ使っているとEG単位でのACID保証はされないということかな? となると、EGの一義的な意味は「ローカリティ(複数のエンティティを物理的に近い位置にまとめる)」であって、「ACID保証の範囲」というのはあくまでJDO/JPAレベルで付加した機能である。。という理解で合っているかな。。?

追記:これは間違いでした。詳しくはコメントをご覧ください。

shin1oshin1o 2009/08/30 17:44 > 確かに。。間違いとまでは言わないけど

すいません、私の書き方がまずかったんで元記事に訂正をいれました。JDOから入るのが間違いというつもりはなく、「間違った理解をしやすい/はまりやすい」という風に書くつもりでした。

> Low-level APIだけ使っているとEG単位でのACID保証はされないということかな?

そこは大丈夫です、キーによるEntityGroupの形成をしてしまえば、Transcationの動作についてはJDOと同じ…というか本来のEntityGroupの動作がそれです。

higayasuohigayasuo 2009/08/30 17:50 Low-level APIだけでEG単位でのACIDは保証されています。
そのためにはトランザクションを引数に持つDatastoreService#put()でEG内で更新が必要なエンティティをすべて指定する必要があります。

JDOで追加されているのは、@Versionを使った楽観的排他制御です。
Bigtableの楽観的排他制御とはまた別の話(だと思います。Python版でもできるから)。

higayasuohigayasuo 2009/08/30 17:58 トランザクションを引数に持つDatastoreService#put()を複数回呼び出しても大丈夫なのかもしれませんが、一回にしておいたほうが、安全な気がします。この辺は、javadocからは読み取れないですね。

higayasuohigayasuo 2009/08/30 18:02 親のKeyを自動採番にしている場合は複数回putを呼び出さざるを得ませんね。ということは、putを複数回呼んでも大丈夫だということですね。ただし、putの引数にトランザクションは必要だと思います。

shin1oshin1o 2009/08/30 18:09 > putの引数にトランザクションは必要

ここは悩んでいる所なんです。put(Transaction tx, Entity entity)とput(Entity entity)の差が見当たらないんですよね。pythonでいうrunInTransactionな方法に慣れていると、transactionを渡したくなるんですが、渡さなければならないという理由が見当たらんので困ってます。

「Transactionを渡しておくのが無難」というカンジで理解する方が良いのでしょうかねぇ。

shin1oshin1o 2009/08/30 18:44 put()のトランザクションの話について、ひさんより元記事の方へコメントして頂いており、それに気づかずこっちへ書いてしまいました。元記事の方にコピーしてコメントをひとつ削除させていただきます。

kazunori_279kazunori_279 2009/08/30 19:10 shin1ogawaさん、ひがさん、コメント&貴重な情報どうもです! 私の本文も直しておきました(どんどん理解が深まってありがたいです)。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/kazunori_279/20090830/1251618096