2012年12月22日土曜日

[GAE/J] Datastore(M/S->HRD)の切り替えで対応したこと

2012/08/24 GAEからM/S利用者へ向けてHRDへの移行を推奨メールが送信されました。
大喜利部というアプリののサーバサイドを移行したときの体験記を書いていますので、よければこちらを参照してください。

基本的に移行後に困ったことは以下の2点です。

1.Blobkeyが変わってしまう

これに関しての解決方法は別途記事で記載済みです。下を参考にしてください。
GAE M/SからHRDへ移行時のBlobkey振り替え対応

2.インデックスの遅延が発生する

これは非常に困りました。
JavaのJDOを利用したデータベース設計としているのですが、この場合、①Query発行してデータ一覧取得するとたまに取得できないことがあります。②また更新されるまで若干遅延があり得るので情報の信頼性もかけてしまいます。
これの解決は以下の方法を取りました。
①これはどうしようもないので、登録直後の一覧取得の際には、極力、更新が追いつかない場合があることをユーザに知らせるようなメッセージを表示するようにしました。
②信頼性を確保するために、LowLevelAPIを利用します。LowLevelAPIのgetは遅延が発生しないとのことです。

導入初期はかなり混乱しましたが、これらの対応により今は障害発生せず沈静化しています。困った場合は試してみてください。

2012年12月8日土曜日

[GAE/J] 登録エラー

背景

GAE/Jで登録時に以下のエラーとなる。
JDOによりデータベース設計してます。
Uncaught exception from servlet java.lang.IllegalStateException: Primary key for type Title is of unexpected type java.lang.Integer (must be String, Long, or com.google.appengine.api.datastore.Key) at com.google.appengine.datanucleus.DatastoreFieldManager.exceptionForUnexpectedKeyType(DatastoreFieldManager.java:162) at com.google.appengine.datanucleus.StoreFieldManager.storePrimaryKey(StoreFieldManager.java:481) at com.google.appengine.datanucleus.StoreFieldManager.storeObjectField(StoreFieldManager.java:179) at org.datanucleus.state.AbstractStateManager.providedObjectField(AbstractStateManager.java:1447)

原因

プライマリーキーとしてInteger型は受け入れられない模様。
Long型に変更したら解決しました。