2016-10-11 4 views
2

App Engine経由でCloud Datastoreを使用してデータを保存するアプリケーションがあります。App EngineのCloud DatastoreがMilestone Bに到達するタイミングを知る方法を教えてください。

データベースにオブジェクトを置くときにクライアントをリフレッシュする必要があります。これを行うには、オブジェクトがデータベースに置かれた後、サーバーはクライアントに同期メッセージを送信します。クライアントは同期メッセージを読み取り、サーバーに照会します。サーバーはQueryを実行して新しい結果を返します。

クエリが実行されると、クエリ結果にputオブジェクトが表示されないという問題があります。ドキュメントを読むと、その理由は、putがマイルストーンBにないということです。https://cloud.google.com/appengine/articles/transaction_isolationを参照してください。これは、別の後の呼び出しオブジェクトが表示されるためです。

パットが「マイルストーンB」に達した時期を知る方法はありますか?それを知ることができない場合は、どうすればこのロジックを実行できますか?

+0

トランザクションを使用していますか? –

+0

はい、同じですが発生します – mabg

答えて

0

インデックスがまだ更新されていないため、クエリの結果にデータが表示されません。 インデックスが更新されるまでには待ち時間がありますが、残念ながらこれがいつ発生するかはわかりません。

このケースを処理する唯一の方法は、エンティティが格納されるとすぐに更新されることを保証する唯一のインデックスであるエンティティのキ​​ーを使用することです。

https://cloud.google.com/appengine/docs/java/datastore/entities

+0

はい、問題はインデックスです。同じ問題を抱えている誰かが、どのように解決していますか? – mabg

+0

祖先クエリを悪用することもできます。 –

+0

IDのクエリ、クラス型および祖先クエリで常に新しく更新された結果を保証する唯一のフィルタです。これらの制限を使用してアクセス可能にするには、データの構造を変更する必要があります。エンティティIDはカスタム文字列にすることができ、特定のカスタムIDを使用してこの問題を解決し、エンティティにIDを照会することもできます。 –

1

あなたは祖先クエリを使用して、最新のクエリ結果を確保することができ、あるいは、あなたが取得する必要がある特定のエンティティのキ​​ーを知っていれば、あなたはキーでそれをフェッチではなく、使用することができますクエリ。

This pageは、祖先クエリを使用する際のトレードオフについて説明しています。

+0

私の問題は、保存されたオブジェクトに、日付と日付の間のオブジェクトをフィルタリングするために使用される「when」フィールドがあることです。私はどのように "いつ"フィールドとの親子関係を行うためにオブジェクトを再構築できるか考えていますが、私は解決策を見つけることができません。何か案は? – mabg

+0

@mabg - 質問にデータモデルを追加します(キー、クエリに使用されるプロパティ、クエリ自体を含める)。この情報はあなたの質問に答えるために必要です。 –

関連する問題