1

のpersist-read-deleteをテストするためのテストWebアプリケーションを作成しました。 を永続化し、取得して変更し、100回削除するEntities単純なループを作成しました。Entity

ループのある間隔では問題はありませんが、Entity既に存在するエラーが存在する間隔があり、そのため永続化できません (私が追加したカスタム例外処理)。

また、ループのある間隔では、Entityが存在しないために変更できず、最後に、ある間隔でEntityが存在しないために削除できません。

ループが速すぎて、Appengineデータストアへの操作がまだ完了していない可能性があることを理解しています。したがって、Entity does not existアクセスしようとしたとき、または削除操作がまだ完了していないため、同じエンティティを作成してもIDまだ作成できないなどのエラーが発生します。

ただし、同時操作がEntity.

4

1 に答える 1

1

私が理解していることから、あなたは次のようなことをしています:

for i in range(0,100):
    ent = My_Entity()    # create and save entity
    db.put(ent)
    ent = db.get(ent.key())   # get, modify and save the entity
    ent.property = 'foo'
    db.put(ent)
    ent.get(ent.key())  # get and delete the entity
    db.delete(my_ent)

削除または変更するエンティティがあることを確認するためのいくつかのエラー チェックがあり、削除または変更するエンティティの検索に関する一連のエラーが発生しています。あなたが言うように、これは呼び出しが順番に実行されることが保証されていないためです。

ただし、エンティティで同時操作が行われているこのような状況を処理する方法を理解したいと思います。

エンティティの永続化のために行っている変更をバッチ処理することをお勧めします。たとえば、作成/保存/変更/保存または変更/保存/削除を行う場合は、可能な限りこれらの手順を組み合わせてください (つまり、作成/変更/保存または変更/削除)。これにより、表示されているエラーが回避されるだけでなく、RPC も削減されます。この戦略に従うと、上記のループは次のように削減されます...

prop = None
for i in range(0,100):
    prop = 'foo'

言い換えれば、ローカル変数を使用するだけですぐに設定/削除が必要な場合。それがGAEの答えです。簡単なことをすべて把握した後、その情報をエンティティに保持することはできません。

それ以外にできることはあまりありません。多数のエンティティをまとめて更新する必要がある場合はトランザクションが役立ちますが、一度に 1 つのエンティティに対して複数の処理を実行しようとしている場合は役に立ちません。

編集:パイプライン APIを見ることもできます。

于 2012-07-05T21:50:54.827 に答える