intellij-idea 在非阻塞上下文中阻塞调用可能会导致线程饥饿,为什么?

wbrvyc0a  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(1702)

我有这样一个控制器和这样一个服务类。为什么我在IDEA中得到这个警告-“Possibly blocking call in non-blocking context could lead to thread starvation“?

@PostMapping(value = {"/create"})
public Mono<ResponseEntity<ResponseDto>> create(
        @RequestBody RequestDto request) {
    ResponseDto result = service.create(request);
    return Mono.just(ResponseEntity.ok(result));
}

@Transactional
public ResponseDto create(RequestDto request) {
    taskRepository.save(request);
    return new ResponseDto("Ок");
}

这显然是由@Transactional注解引起的。当我删除它时,警告消失了。这是什么问题?如何修复?
这个例子是示意性的。真实的的代码更大。

0mkxixxg

0mkxixxg1#

React式进程与规范相反。您不能在这里使用阻塞元素!使用Tomcat,它为每个请求创建一个单独的线程,这样主题就可以被阻塞。React式Netty不会创建新的线程,只是使用一个固定的池。
对于松散的方法,您可以认为如果一个进程正在等待响应,它会将该线程的资源提供给另一个进程。如果您阻塞它,它将无法执行此操作。因此,即使使用单线程Netty,它也可以处理多个并行请求。因此,基于线程的数据存储也不能正常工作,因为另一个进程可能会干扰或修改它。因此,而是可以使用React式上下文。
有一篇文章对React性交易.我不知道它会为你解决:https://itnext.io/integrating-hibernate-reactive-with-spring-5427440607fe

相关问题