ラベル 非同期データストア呼び出し の投稿を表示しています。 すべての投稿を表示
ラベル 非同期データストア呼び出し の投稿を表示しています。 すべての投稿を表示

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/

2011年10月2日日曜日

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

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

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



Async Queries (非同期クエリ)

現時点では、明示的にクエリ向けの非同期APIを提示してはいません。しかしながら、PreparedQuery.asIterable(),PreparedQuery.asIterator(),PreparedQuery.asList(FetchOptions fetchOptions)メソッドを呼び出すと、DatastoreServiceまたはAsyncDatastoreServiceのどちらも、直ちに値を返し、非同期に結果を先取りします。これによってアプリケーションの動作がクエリの結果が取得される間に平行して行われます。

// ...

Query q1 = new Query("Salesperson");
q1.addFilter("dateOfHire", FilterOperator.LESS_THAN, oneMonthAgo);

// Returns instantly, query is executing in the background.
Iterable recentHires = datastore.prepare(q1).asIterable();

Query q2 = new Query("Customer");
q2.addFilter("lastContact", FilterOperator.GREATER_THAN, oneYearAgo);

// Also returns instantly, query is executing in the background.
Iterable needsFollowup = datastore.prepare(q2).asIterable();

schedulePhoneCall(recentHires, needsFollowUp);



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

2011年9月30日金曜日

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

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

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

Working with Futures (Futureの使用)

Future のJavadocは、非同期データストアAPIから返されたFutureを上手く使用する上で知る必要のあることのほとんどを説明していますが、App Engine固有の注意点があります。
・Future.get(long timeout, TimeUnit unit)メソッドを呼び出した時に、timeoutはAsyncDatastoreServiceを生成した時点のRPCデッドラインのセットから切り離されています。詳しくは、datastore RPC deadlinesのドキュメントを参照してください。
・Future.cancel(boolean mayInterruptIfRunning)メソッドを呼び出し、trueが返された場合、データストアの状態が変更されていないことを必ずしも意味するものではありません。言い換えると、Futureをキャンセルすることは、トランザクションをロールバックすることと同じではありません。

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

2011年9月26日月曜日

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

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

英語版ドキュメントはこちら。
その1はこちら,その2はこちら。


Workind with Async Transactions 非同期トランザクションの使用

非同期データストアAPI呼び出しは、同期呼び出しと同じようにトランザクションに参加することができます。ここで挙げるのは、従業員の給料の額を調整し、Employeeと同じエンティティグループにSalaryAdjustmentエンティティを1つのトランザクション内で追加して書き込みます。

void giveRaise(AsyncDatastoreService datastore, Key employeeKey, long raiseAmount)
        throws Exception {
    Future txn = datastore.beginTransaction();

    // Async call to lookup the Employee entity
    Future employeeEntityFuture = datastore.get(employeeKey);

    // Create and put a SalaryAdjustment entity in parallel with the lookup
    Entity adjustmentEntity = new Entity("SalaryAdjustment", employeeKey);
    adjustmentEntity.setProperty("adjustment", raiseAmount);
    adjustmentEntity.setProperty("adjustmentDate", new Date());
    datastore.put(adjustmentEntity);

    // Fetch the result of our lookup to make the salary adjustment
    Entity employeeEntity = employeeEntityFuture.get();
    long salary = (Long) employeeEntity.getProperty("salary");
    employeeEntity.setProperty("salary", salary + raiseAmount);

    // Re-put the Employee entity with the adjusted salary.
    datastore.put(employeeEntity);
    txn.commit(); // could also call txn.commitAsync() here
}

このサンプルは、トランザクション無しの非同期呼び出しとトランザクション内での非同期呼び出しの違いを示しています。トランザクションを利用していない場合、独立した非同期呼び出しの官僚を確認する唯一の方法は、呼び出しが行われた時に戻されたFutureの値を取得するということになります。トランザクションを利用すると、Transaction.commit()の呼び出しが、トランザクション開始からコミットされる前までの全ての非同期呼び出しの結果をブロックします。

そのため、上記の例では、SalaryAdjustmentエンティティの挿入を行う非同期呼び出しがtxn.commit()を呼び出された時点では未解決の可能性があるにもかかわらず、挿入が完了するまでにコミットは起こりません。同様に、txn.commit()の代りにtxn.commitAsync()の呼び出しを選択すると、commitAsync()から返されたFutureのget()メソッド呼び出しが全ての未解決の非同期呼び出しが干渉するまでブロックします。

ノート:トランザクションは特定のスレッドに関連付けられますが、DatastoreServiceやAsyncDfatastoreServiceの特定のインスタンスには関連付けられません。これの意味するところは、あるDatastoreServiceからトランザクションを開始して、
あるAsyncDatastoreServiceから非同期呼び出しを行うと、非同期呼び出しはトランザクションに参加する、ということです。または、もっと簡潔に言えば、
DatastoreService.getCurrentTransaction()とAsyncDatastoreService.getCurrentTransaction()は常に同じトランザクションを返すということです。

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

2011年9月25日日曜日

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

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

英語版ドキュメントはこちら。
その1はこちら。

Working with the Async Datastore Service (非同期データストアサービスの使用)

非同期データストアAPIでは、AsyncDatastoreServiceインターフェイスのメソッドを使ってデータストア呼び出しを行います。このオブジェクトはDatastoreServiceFactoryクラスのgetAsyncDatastoreService()クラスメソッドを呼び出して
取得します。

import com.google.appengine.api.datastore.AsyncDatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;

// ...
AsyncDatastoreService datastore = DatastoreServiceFactory.getAsyncDatastoreService();

AsyncDatastoreServiceは、結果の取得を後の時点でブロックすることが出来るFutureを直ちに返すメソッドを除いて、DatastoreServiceと同じ操作をサポートしています。例として、DatastoreService.get()は1つのエンティティを返しますが、AsyncDataStoreService.get()はFuture<Entity>を返します。

// ...

Key key = KeyFactory.createKey("Employee", "Max");
// Async call returns immediately
Future<entity> entityFuture = datastore.get(key);

// Do other stuff while the get operation runs in the background...

// Blocks if the get operation has not finished, otherwise returns instantly
Entity entity = entityFuture.get();

ノート:get()メソッドを呼び出すまでは例外はスローされません。このメソッドの呼び出しは非同期操作の成功/不成功の検査に利用できます。

AsyncDatastoreServiceを取得しているけれども同期した操作の実行を必要とする場合、適切なAsyncDatastoreServiceのメソッドを呼び出してからすぐにresultのブロックをかけます。

// ...

Entity entity = new Employee("Employee", "Alfred");
// ... populate entity properties

// Make a sync call via the async interface
Key key = datastore.put(key).get();

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

2011年9月22日木曜日

Google App Engine for Java の非同期データストア呼び出し

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

英語版ドキュメントはこちら。


Async Datastore API (非同期データストアAPI)

非同期データストアAPIは、リクエストのハンドリングよりも後の時点で、並列にブロッキングされないデータストア呼び出しから結果を取得することを可能にします。このドキュメントは非同期データストア呼び出しの以下の側面を記述しています。
・Working with the Async Datastore Service 非同期データストアサービスの動作
・Working with Async Transactions 非同期トランザクションの動作
・Working with Futures Futureの動作
・Async Queries 非同期クエリ
・When To Use Async Datastore Calls 非同期データストア呼び出しの使用タイミング


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