0

Ebeanを使用して重いデータベースアクセスを持つプレイ2.5プロジェクトをセットアップしました。私は= 100 maximumPoolSizeにhikaricpを設定し、minimumIdle = 100とhikaricpプール100接続に成功し、私はまた、このようにスレッドプールを設定:なぜプレイフレームワーク2.5が接続プール内のすべての接続を使用しないのですか

akka { 
    actor { 
    default-dispatcher { 
     executor = "thread-pool-executor" 
     throughput = 1 
     thread-pool-executor { 
     fixed-pool-size = 109 # db conn pool (100) + number of cores (8) + housekeeping (1) 
     } 
    } 
    } 
} 

私はCompletionStageを使用して非同期アクションを実装:

public CompletionStage<Result> asyncDb() { 
    CompletableFuture<Integer> future = new CompletableFuture<>().supplyAsync(() -> { 
     Ebean.createSqlQuery("select sleep(3)").findUnique(); 
     return 0; 
    }); 

    return future.thenApplyAsync(integer -> ok("done")); 
} 

私はシステムを実行します

ab -n 10000 -c 100 -r -k http://localhost:9000/asyncDb 

問題は、プールと他のmysql接続からの7または8の接続のみを使用して再生することです。一方、要求がある間、アイドルアイドル、なぜですか?

答えて

0

Greg Methvin私の質問play google group: 私は問題は、CompletableFuture.supplyAsyncはデフォルトのディスパッチャを使用していないと思います。代わりに、ForkJoinPool.commonPool()を使用しています。

  1. があなたのコントローラにActorSystemをパスし、()actorSystem.dispatcherを呼び出す:あなたは実際に2つのオプションがありエグゼキュータのExecutor

    を受け入れthe versionを使用する必要が

    this linkを参照してください)上記のように構成するか、

  2. データベース専用の100個のスレッドで個別のエグゼキュータを作成し、要求の処理用にデフォルトのエグゼキュータを保持します。ここでは異なるオプションのチェックアウトthe documentation

は、スレッドプールを再: