gpt4 book ai didi

java - 返回 CompletableFuture 的 Spring Transactional 方法

转载 作者:行者123 更新时间:2023-11-30 10:34:21 38 4
gpt4 key购买 nike

我有从服务调用方法的 RestController。方法将用户添加到最多 20 个连接的 PostresSQL 数据库。

@RestController
public class Controller {
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String addUser(@RequestBody UserInfo userInfo) {
Future<String> completableFuture = userService.addUser(userInfo);
String answer = voidCompletableFuture.get();
return answer;
}
}

服务中的方法由Spring Transactional注解,持久化数据方法返回CompletableFuture后,里面有一些长操作。我从多个线程(大约 100 个)同时调用方法“/user”。

@Transactional
public Future<String> addUser(UserInfo userInfo) {
userDao.persist(userInfo);
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(10000);
return "Result";
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Error";
});
}

如果调用阻塞当前线程的代码行“voidCompletableFuture.get()”,则只有 20 个并发请求在工作,并按最大连接数将数据添加到数据库。另一个线程出现异常:

Caused by: java.sql.SQLTransientConnectionException: Connection is not available, request timed out after 30000ms.

如果我删除这行代码,那么每个请求都会正常工作并按预期将数据添加到数据库中。我认为这是因为如果我在之后调用 future.get() 方法“public Future addUser(UserInfo userInfo)”结束后事务未完成。也许有人知道为什么 Spring 和 CompletableFuture 以这种方式工作或者可能有另一个答案?为什么阻塞 CompletableFuture 会影响另一种方法中事务的结束?如果请求方法中有一个 block ,为什么方法不完成当前事务并且不释放连接。

最佳答案

在添加 spring.jpa.open-in-view=false 之后,事务在方法 setUser() 之后开始停止,而不是在整个请求过程中停止。

来自文档:spring.jpa.open-in-view=true - 注册 OpenEntityManagerInViewInterceptor。将 JPA EntityManager 绑定(bind)到线程以进行整个请求处理。

关于java - 返回 CompletableFuture 的 Spring Transactional 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41685352/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com