在 N 个并行保存请求后 Spring Boot Rest Api 卡住了

Posted

技术标签:

【中文标题】在 N 个并行保存请求后 Spring Boot Rest Api 卡住了【英文标题】:Spring Boot Rest Api stucked after N parallel save requests 【发布时间】:2019-09-30 10:58:41 【问题描述】:

我正在使用 Spring Boot 创建一个 Rest Api。我使用的是 Hikari 的默认配置,因此它的池大小为 10 个连接。 当我尝试向特定路由发布 10 个并行请求时遇到错误。错误提示 Connection is not available, request timed out after 30001ms. 此路由将数据保存到 mysql 数据库中,通常需要几毫秒才能完成一次保存操作。 为什么会出现这个问题?它是否应该完成保存操作,然后释放数据库连接以进行下一个操作? 这个错误似乎只出现在保存函数创建新实体的保存操作中。

属性

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://192.168.1.88:3306/question?serverTimezone=UTC
spring.datasource.username=luigi
spring.datasource.password=root

存储库

public interface RandomRepository extends CrudRepository<Random, Integer> 

控制器

@RestController
public class RandomController 
    private RandomRepository randomRepository;

    public RandomController(RandomRepository randomRepository) 
        this.randomRepository = randomRepository;
    

    @GetMapping("/")
    public String createRandom() 
        return String.valueOf(Math.random());
    

    @PostMapping("save")
    public Random save()
        Random random = new Random();
        random.setNumber(Math.random());

        randomRepository.save(random);

        return random;
    

我通过使保存方法同步找到了解决方案。这是正确的方法吗?有人遇到过同样的问题吗?

可能的解决方案

@PostMapping("save")
public synchronized Random save()
    Random random = new Random();
    random.setNumber(Math.random());

    randomRepository.save(random);

    return random;

我希望保存操作会很容易完成,但它卡住了,直到它在 30 秒后崩溃

【问题讨论】:

您使用的是什么数据库,数据源是如何配置的? 请在您的问题中添加一些配置、执行持久化等的实际代码。目前信息太少。 我已经更新了我的问题 @LuigiDeCosmis 如果您觉得我的回答很有用,如果您也能提出来,我将不胜感激。 @riorio 我不能。它说我需要更多的声誉 【参考方案1】:

我们在使用 Spring Boot 和 Couchbase 时遇到了非常相似的问题。

当请求数较多时,与数据库的连接卡住了。

我们使用的解决方案是转移到所有级别的异步方法调用 - 从控制器到数据库操作。

See this post & answer

【讨论】:

以上是关于在 N 个并行保存请求后 Spring Boot Rest Api 卡住了的主要内容,如果未能解决你的问题,请参考以下文章

执行登录保存请求后,Spring Boot Security POST 重定向到登录页面

Spring Boot 是不是创建 N 个线程来处理 N 个 API 请求?

spring boot 应用程序只接受 6 个请求,为啥?

Spring Boot Async 方法如何使用 ThreadPool 处理请求

并行分发请求

为啥 Spring Webflux 只能并行接受 256 个请求?