使用 CompletableFuture 调用存储过程

发布于 2025-01-09 09:45:55 字数 102 浏览 0 评论 0原文

我有一个 Springboot API,它使用可调用语句最多进行 6 次存储过程调用。我想让这个调用异步。是否可以使用 CompleteableFuture(java8) 来实现这一点???

I have a Springboot API that makes a maximum of 6 Stored Procedure calls using the callable statement. I want to make this call asynchronous. Is it possible to achieve this using CompleteableFuture(java8)???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雪花飘飘的天空 2025-01-16 09:45:55

数据库连接通常不是线程安全的。您计划每次通话使用一个连接吗?
如果是,以下代码将并行执行可调用语句。请注意,我使用了 vavr 库来简化异常处理。

public List<Boolean> concurrentCalls(Supplier<Connection> connectionSupplier, List<String> statements) {
        Function<String, Either<Throwable, Boolean>> executeStatement = statement ->
                Try.of(() -> connectionSupplier.get()
                .prepareCall(statement)
                .execute())
                .toEither();

        List<CompletableFuture<Boolean>> completableFutures = statements.stream()
                .map(statement ->
                        CompletableFuture.supplyAsync(() -> executeStatement.apply(statement))
                        .thenApply( Either::get) // Handle exceptions as required
                )
                .collect(Collectors.toList());

        return CompletableFuture.allOf( completableFutures.toArray( new CompletableFuture[0]))
                         .thenApply( any ->
                                 completableFutures
                                         .stream()
                                         .map(CompletableFuture::join)
                                         .collect(Collectors.toList())
                         )
                         .join();
}

Database connections are typically not thread-safe. Are you planning to use one connection per call?
If yes, following code will execute the callable statements in parallel. Please note I have used vavr library to simplify the exception handling.

public List<Boolean> concurrentCalls(Supplier<Connection> connectionSupplier, List<String> statements) {
        Function<String, Either<Throwable, Boolean>> executeStatement = statement ->
                Try.of(() -> connectionSupplier.get()
                .prepareCall(statement)
                .execute())
                .toEither();

        List<CompletableFuture<Boolean>> completableFutures = statements.stream()
                .map(statement ->
                        CompletableFuture.supplyAsync(() -> executeStatement.apply(statement))
                        .thenApply( Either::get) // Handle exceptions as required
                )
                .collect(Collectors.toList());

        return CompletableFuture.allOf( completableFutures.toArray( new CompletableFuture[0]))
                         .thenApply( any ->
                                 completableFutures
                                         .stream()
                                         .map(CompletableFuture::join)
                                         .collect(Collectors.toList())
                         )
                         .join();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文