2010/7/29 Yoshinori Asakawa <yos.a...@gmail.com>:
> はじめまして、浅川と申します。
>
> Kayフレームワークのマニュアルのダンプとリストアの項で触れられている
> 別のアプリへのリストア後の自動採番のidの重複を回避するため、
> ワークアラウンドとして、全てのエンティティを key_name を指定して保存しようとしています。
> http://kay-docs-jp.shehas.net/dump_restore.html
現在の SDK でも、自動採番 id
の処理はまだちょっと甘いように思うので、別アプリにリストアする事が必要なケースでは、意味のあるワークアラウンドだと思います。
しかし、例えばリストア先の app id で、事前に充分大きな数まで allocate_ids
しておくなど、他のワークアラウンドもあります。もしかしたらこちらの方が簡単で良いかもしれません。
> key_nameを指定して保存したエンティティは http://foo.com/<key_name>/ のような形で
> ユーザからアクセスできるようにしたく、なるべく短く可読性の高い(※) 形式で生成しようと
> allocate_idsで取得した自動採番のidを利用した、下記のようなメソッドを作成しました。
> (※例えば「WwQdsV6ZSzS0KTWrTkdnsA」よりも「aa1234567」の方がユーザにとって使いやすいかと考えました)
この方法で、きちんとエンティティが分散するかちょっと不安ですね。要確認
> しかしながら、ローカルの開発サーバで実行すると、開発サーバの再起動後に
> allocate_idsが同じidを振り出してしまい、一意なkey_nameを作成することができませんでした。
> 本番のappengine環境では意図したように動いているように見えますが、
> 何かしらのきっかけで開発サーバと同じ事象が発生してしまうのではないかと懸念しています。
本番サーバーでは起きないはずです。起きたら大変なので。
> そこで以下2点を皆様にお伺いしたく、ご存知の方がいましたらご教示いただけませんでしょうか。
>
> 1. http://foo.com/<key_name>/ のような形でユーザからアクセス出来るようにするための
> なるべく短く可読性の高い、一意のkey_nameを払いだす方法をご教示いただけないでしょうか。
allocate_ids を使わない方法としてはユニーク制約のついたカウンターとして別 kind を使う方法があるかと思います。
> 2. allocate_idsで採番したidを、idではなくkey_nameとして使用した場合
> 同じidが再度払い出されてしまうことがあるのでしょうか?
> それとも開発サーバの固有の事象なのでしょうか?
本番では無いはずです。
--
Takashi Matsuo
matsuo....@gmail.com
Kay's daddy
開発サーバーと本番サーバーですこし試してみました。
■開発サーバーでは・・・
1) allocate_idsで取得したid値をkey_name値に指定した場合
Datastore Viewerで見ると・・・
・key_name値は指定したid値。
・id値は空っぽ。
開発サーバーを再起動すると・・・
・allocate_idsで取得されるid値は、先に取得したのと
同じ値が再度取得される。
・結果、そのid値をkey_name値に指定すると、先に登録
したデータが上書きされてしまう。
2) key_name値を指定しない場合
Datastore Viewerで見ると・・・
・key_name値は空っぽ。
・id値は自動的に設定された値。
開発サーバーを再起動すると・・・
・allocate_idsで取得されるid値は、保存されているid値の次の
id値から取得される。
■本番サーバーでは・・・
1) allocate_idsで取得したid値をkey_name値とした場合
Datastore Viewerで見ると・・・(開発サーバーと表示が違う・・・)
・ID/Name値として、"name=XXXX"という形で値が設定(表示)されている。
本番サーバーを再起動はできません・・・
2) key_name値を指定しない場合
Datastore Viewerで見ると・・・(開発サーバーと表示が違う・・・)
・ID/Name値として、"id=XXXX"という形で値が設定(表示)されている。
本番サーバーを再起動はできません・・・
結局、開発サーバーだと、起動している間はアロケートしたidの情報を
保持していて、再起動後はid値を見て、idの開始値を決めている感じに
みえますね。
本番サーバーは・・・こんな感じになりましたということで・・・。