调用mybatis的insert方法阻塞问题
Posted 敲代码的小小酥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用mybatis的insert方法阻塞问题相关的知识,希望对你有一定的参考价值。
场景:
提示:这里简述项目相关背景:
使用mybatis大量插入数据
问题描述:
提示:这里描述项目中遇到的问题:
发现后调用isnert方法的数据比先调用insert方法的数据先插入到数据库(没有事务的情况下),由此引发思考,java中的insert方法难道不是等sql执行完再往下执行其他方法的吗?
实验分析:
提示:这里填写问题的分析:
下面进行实验,我们先把表锁住,这样,mybatis调用insert方法的时候,insert语句肯定是插入不进去的,然后我们验证java中的insert方法是否会阻塞:
首先,先锁表:
set autocommit = 0;
DELETE from `digitaltwin_cars_2021-11-05`
然后再往这张表中通过程序添加数据:
@GetMapping("/ceshi")
@ResponseBody
public AjaxResult ceshi(String roadid,String startTime){
//trafficIncidentService.analysisTraffic();
for (int i=0;i<10;i++){
System.out.println("循环"+i);
Cars cars=new Cars();
cars.setTablename("`digitaltwin_cars_2021-11-05`");
cars.setCarNum("cscs");
cars.setRoadid("cscs");
cars.setUid("xxx");
carsService.insertCars(cars);
}
System.out.println("执行完了");
return AjaxResult.success();
}
通过断点发现,程序也会发生阻塞。说明mybatis是等待sql执行完之后,才会往下进行的。
结论:
提示:这里填写该问题的具体解决方案:
mybatis的insert方法会发生阻塞。而项目中出现的后调用insert方法先插入数据的情况,是mysql服务器磁盘IO 100%情况下复现的。这说明mysql在内部还进行了复杂的处理。
以上是关于调用mybatis的insert方法阻塞问题的主要内容,如果未能解决你的问题,请参考以下文章
连接池(理论上应该是任意连接池) spring方法切入 mybatis redis等待请求 用了mysql连接的方法阻塞超过8小时导致mysql关闭连接 应用复活后用了已关闭连接而异常