2011-12-26 17 views
6

Playからちょうど始まります。このドキュメントでは、Playを非同期に実行する方法について説明します。Playフレームワークで非同期/非ブロッキングMySQLクエリを実行するにはどうすればよいですか?

しかし、Playを非同期で実行しているときにMySQLクエリを実行するにはどうすればよいですか?通常のMySQLクエリはブロックされています。それはうまくいかないでしょう。

Node.jsには、この目的のために専用の非ブロッキングMySQLクライアントがありますが、Playと同様のものは見つかりません。

非同期のPlayアプリケーションでMySQLクエリを実行するにはどうすればよいですか?

答えて

3

このリンクを参照してくださいAsynchronous jobs in play framework。

+1

ありがとうございました。私は仕事がどのように非ブロッキングであるかを理解しているかどうか分からない。私のMySQLクライアントがブロックしている場合は、ジョブ内でそれを使用することはまだブロックされていますか?または、Playは新しいジョブが作成されるたびに新しいスレッドを作成しますか?そのような場合、非同期フレームワークの全目的を破ることになります。 – Continuation

+2

@Continuation「非同期フレームワーク」と「非同期操作が可能なフレームワーク」をPlayに関して混乱させるかもしれないと思います!フレームワーク?リンクされたドキュメントで説明されているように、ジョブを使用して、HTTP要求からノンブロッキングから他の受信HTTP要求まで非同期的に長時間実行される操作を実行できます。 – tmbrggmn

2

プレイジョブは別のスレッドで実行され、メインのhttpスレッドを解放します。メインのhttpスレッドは、完了後にジョブ(プロミスオブジェクトにラップされた)が戻るときに中断されたところで開始されます。

したがって、メインのhttpスレッドは保持されず、他の着信HTTP要求を処理するために利用できるようにすることができます。

0

通常、DBへのSQLコールの実行は、通常、順次ブロックされ、順番に実行されます。 Playは、アプリのパフォーマンスを向上させる非同期実行を強力にサポートしています。プレイ2.0

public static Result slow() { 
    Logger.debug("slow started"); 

    // Start execution 
    Promise<DataObject> userObject1 = SlowQuery.getUser(440); 
    Promise<DataObject> userObject2 = SlowQuery.getCategory(420); 
    // ... here execution is already in progress ... 

    // Map to Promise Objects 
    Promise<DataObject> res1 = userObject1.map(new Function<DataObject, DataObject>() { 
     public DataObject apply(DataObject res) { 
      Logger.debug("Got result (userObject1): " + res.toString()); 
      return res; 
     } 
    }); 

    Promise<DataObject> res2 = userObject2.map(new Function<DataObject, DataObject>() { 
     public DataObject apply(DataObject res) { 
      Logger.debug("Got result (userObject2): " + res.toString()); 
      return res; 
     } 
    }); 

    // here we wait for completion - this blocks 
    userObject1.getWrappedPromise().await(); 
    userObject2.getWrappedPromise().await(); 

    // the result is available 
    Logger.debug(res1.get().toString()); 
    Logger.debug(res2.get().toString()); 

    Logger.debug("slow finished"); 
    return ok("done"); 
} 

のためのサンプルコードを作業する

は、コミュニティのwiki機能を使用して改善して自由に感じる - 私はいくつかの部分を短縮することができると確信しています。

+7

しかし、データベースクライアント自体がブロックしている限り、プレイスレッドもブロックされますか? Node.jsは非ブロッキングMySQLクライアントを提供し、問題を解決します。しかし、私はPlayが非ブロッキングDBクライアントを提供しているとは思わない。あなたのコードがDBコールを非ブロッキングにする方法を説明できますか? – Continuation

関連する問題