为什么PlayFramework2.5不使用连接池中的所有连接

zte4gxcn  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(350)

我已经使用ebean设置了一个play2.5项目,其中包含大量的数据库访问。我成功地将hikaricp配置为maximumpoolsize=100和minimumidle=100,并将hikaricp pool 100连接成功,还将线程池配置为:

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"));
}

我使用sbt start运行系统,并使用apache基准测试:

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

问题是播放时只使用池中的7或8连接,其他mysql连接空闲,同时有请求,为什么?

jckbn6z7

jckbn6z71#

Greg Methvin 在PlayGoogle小组中回答了我的问题:我认为问题是completablefuture.SupplySync没有使用默认的调度程序。而是使用forkjoinpool.commonpool()((请参见此链接)
您需要使用接受执行器的版本
对于遗嘱执行人,你实际上有两个选择:
将actorsystem传递给控制器并调用actorsystem.dispatcher(),然后按照上面所做的操作对其进行配置,或者
为您的数据库创建一个具有100个线程的单独执行器,并保留用于处理请求的默认执行器。
请查看此处的文档,以了解有关线程池的不同选项:

相关问题