Zunächst sollten Sie sich die ThreadPoll-Konfigurationsdokumentation ansehen , falls du das noch nicht getan hast. Es sollte Ihnen einen Überblick über die Thread-Pools geben, die Play standardmäßig verwendet, und wie Sie sie optimieren können (Sie benötigen möglicherweise keinen bestimmten Thread-Pool, nur um Abfragen durchzuführen ...).
Es enthält viele Tipps, einschließlich Tipps zum Konfigurieren von Thread-Pools, die für JDBC-Operationen optimiert sind.
Nun zu Ihrer Frage, Sie müssen nur noch supplyAsync
verwenden mit einem benutzerdefinierten ExecutorService
zu tun, was Sie brauchen. Ein Beispiel:
public CompletionStage<Result> getData() {
CompletableFuture<List<SqlRow>> cf = new CompletableFuture<>();
return cf.supplyAsync(() -> {
return Ebean.createSqlQuery("SELECT * FROM Users").findList();
}, ec) // <-- 'ec' is the ExecutorService you want to use
.thenApply(rows -> {
return ok(Json.toJson(rows));
});
}
Beachten Sie, dass Sie in Ihrem Code Akka verwenden, um einen ExecutionContext
zu erhalten (Scala) und supplyAsync
erwartet einen Executor/ExecutorService
(Java). Sie müssen also Ihren ServiceExecutor
erstellen selbst erstellen und teilen
// Thread pool with 10 threads
ExecutorService ec = Executors.newFixedThreadPool(10);
oder Sie müssen zwischen ihnen konvertieren. Dieser Kern sollte Ihnen dabei helfen, das zu erreichen