Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer un pool de threads db dans Play Java et effectuer des requêtes db avec ce pool

Tout d'abord, vous devriez jeter un œil à la docs de configuration de ThreadPoll , si vous ne l'avez pas encore fait. Il devrait vous donner un aperçu des pools de threads que Play utilise par défaut et comment les modifier (vous n'avez peut-être pas besoin d'un pool de threads spécifique juste pour faire des requêtes...).

Il contient de nombreux conseils, notamment des conseils pour configurer des pools de threads optimisés pour les opérations JDBC.

Maintenant, concernant votre question, il vous suffit d'utiliser supplyAsync avec un ExecutorService personnalisé pour faire ce dont vous avez besoin. Un exemple :

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

Notez qu'à partir de votre code, vous utilisez Akka pour obtenir un ExecutionContext (Scala), et le supplyAsync attend un Executor/ExecutorService (Java). Il vous faudra donc créer votre ServiceExecutor par vous-même et partagez-le

// Thread pool with 10 threads
ExecutorService ec = Executors.newFixedThreadPool(10);

ou vous devrez convertir entre eux. Cet essentiel devrait vous aider à y parvenir