为了账号安全,请及时绑定邮箱和手机立即绑定

在N个并行保存请求之后,Spring Boot Rest Api陷入困境

在N个并行保存请求之后,Spring Boot Rest Api陷入困境

元芳怎么了 2019-04-10 10:11:40
我正在使用Spring Boot创建Rest Api。我正在使用Hikari的默认配置,因此它的池大小为10个连接。当我尝试将10个并行请求发布到特定路由时遇到错误。错误表示Connection不可用,请求在30001ms后超时。 此路由将数据保存到MySQL数据库中,通常需要几毫秒才能完成一次保存操作。为什么会出现这个问题?它应该完成保存操作,然后释放数据库连接以进行下一个操作吗?此错误似乎仅出现在保存功能创建新实体的保存操作中。属性spring.jpa.hibernate.ddl-auto=create-drop spring.datasource.url=jdbc:mysql://192.168.1.88:3306/question?serverTimezone=UTCspring.datasource.username=luigi spring.datasource.password=root知识库public interface RandomRepository extends CrudRepository<Random, Integer> {}调节器@RestControllerpublic 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;     }}我通过使save方法同步找到了解决方案。这是正确的方法吗?有人遇到过同样的问题吗?可能解决方案@PostMapping("save")public synchronized Random save(){     Random random = new Random();     random.setNumber(Math.random());     randomRepository.save(random);     return random;}我预计保存操作将很容易完成,但它会一直停留,直到它在30秒后崩溃
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

使用Spring Boot和Couchbase时,我们遇到了一个非常类似的问题。

当请求数量很高时,与DB的连接被卡住了。

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


查看完整回答
反对 回复 2019-05-15
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

使save()方法同步将序列化访问,这反过来会大大降低性能。


查看完整回答
反对 回复 2019-05-15
  • 2 回答
  • 0 关注
  • 537 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号