私はGoogleのアプリエンジンのものに初心者です。私は昨日からアプリエンジンについて読んでいます。リクエストタイムアウト中にの書き込みトランザクションに関する疑問があります。Googleのアプリケーションエンジンで要求がタイムアウトしたときに書き込みトランザクションを処理する方法
私は万個のオブジェクトを作成し、単一のトランザクションによって救うためにそれをしようとしていたとしている1000個のオブジェクトを保存した後、その要求の時限とし、この
String greeting = "test";
String guestBookName = "default";
DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
Key guestBookKey = KeyFactory.createKey("GuestBook", guestBookName);
for(int i=0;i<10000;i++)
{
Entity entity = new Entity("Greeting", guestBookKey);
entity.setProperty("date", new Date());
entity.setProperty("greeting", greeting);
datastoreService.put(entity);
}
のように(DatastoreServiceはHibernateのトランザクションのようなものであると仮定して) 1000個のオブジェクトが削除されますか?
私はアプリケーションエンジンでこのコードを実行しましたが、要求がタイムアウトしたデータストアに1164個のオブジェクトを保存しました。このエラーが発生しました
....Uncaught exception from servlet
com.google.apphosting.api.DeadlineExceededException: This request (0000000000000000)
started at 2011/10/20 07:18:36.726 UTC and was still executing at 2011/10/20 07:19:36.143 UTC.....
オブジェクトはデータストアから削除されませんでした。私はhereを読みます。
データストアは、1回のトランザクションで複数の操作を実行できます。トランザクションのすべての操作が成功しない限り、トランザクションは正常に処理されません。いずれかの操作が失敗した場合、トランザクションは自動的にロールバックされます。これは、複数のユーザーが同時に同じデータにアクセスしたり操作したりする分散型Webアプリケーションに特に便利です。
誰もがこれについて明確に理解できるように助けてください。
ありがとうございます。
私は私の質問に答えを見つけたと思う。私は次のことを行うことを考えています キャッチブロックを書きます。時間がなくなると、 "i"の値を記録し、 "i"をパラメータとして送信する同じリクエストにリダイレクトを再度送信します。 URLにパラメータが存在する場合、 "i"の値が取得され、残りのオブジェクトが保存されます。 アプローチは正しいですか? –
より良い方法は、タスクキューでこれを行うことであり、ユーザーが直面する要求ではありません。また、すべてのエンティティを単一のエンティティグループに入れると、サポートできる更新レートに厳しい制限が課せられます。 –
@NickJohnsonありがとうございます。私は詳細を得ることができる適切なリンクを私に送ってください。 –