2011年10月3日月曜日

Google App Engine for Java の非同期データストアAPIの呼び出し(その6)

Google App Engineのデータストアは、
非同期に呼び出して結果を取得することも出来ます。

英語版ドキュメントはこちら
その1,その2,その3,その4,その5も参照してみてください。


When To Use Async Datastore Calls 非同期データストア呼び出しの使用タイミング

DatastoreServiceインターフェイスによって提示される操作は同期呼び出しをします。例えば、コードは、DatastoreService.get()を呼び出すした時にデータストアへのコールが完了するまでブロックします。アプリケーションが行う必要のある1つだけの動作がHTML内でget()の結果をレンダリングすることの場合、呼び出しが完了するまでブロックすることは完全に合理的なことです。
しかしながら、アプリケーションがget()の結果にプラスしてクエリの結果をレスポンスにレンダリングする場合、またはget()とクエリがデータ依存関係を持たない場合、get()が完了するまで待ってからクエリを開始するのは時間の無駄です。ここでは、非同期APIを用いて改善されたコードの例を示します。

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key empKey = KeyFactory.createKey("Employee", "Max");

// Read employee data from the Datastore
Entity employee = datastore.get(empKey); // Blocking for no good reason!

// Fetch payment history
Query query = new Query("PaymentHistory");
PreparedQuery pq = datastore.prepare(query);
List<Entity> result = pq.asList(FetchOptions.Builder.withLimit(10));
renderHtml(employee, result);

get()が完了するまで待つかわりに、非同期にメソッド呼び出しを実行するためにAsyncDatastoreServiceのインスタンスを使用します。

AsyncDatastoreService datastore = DatastoreServiceFactory.getAsyncDatastoreService();
Key empKey = KeyFactory.createKey("Employee", "Max");

// Read employee data from the Datastore
Future<Entity> employeeFuture = datastore.get(empKey); // Returns immediately!

// Fetch payment history for the employee
Query query = new Query("PaymentHistory", empKey);
PreparedQuery pq = datastore.prepare(query);

// Run the query while the employee is being fetched
List<Entity> result = pq.asList(FetchOptions.Builder.withLimit(10));
// Implicitly performs query asynchronously
Entity employee = employeeFuture.get(); // Blocking!
renderHtml(employee, result); 

このコードの同期バージョンと非同期バージョンは、同様な量のCPUを使用します(結局のところ、どちらも同じ計算量を示します)が、非同期バージョンは平行動作のために2つのデータストア操作を行うので、非同期バージョンの方が待ち時間がより少なくなります。一般的に、データ依存関係のない複数のデータストア操作を行う必要がある場合は、AsyncDatastoreServiceは大幅に待ち時間を改善します。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

0 件のコメント:

コメントを投稿