MyBatis批量插入为什么比单条插入块?
【摘要】 今天在利用excel处理业务数据的时候开始打算一条一条插入数据库!因为要做数据校验和数据保存返回id之后进行其他表也插入!大约有30000多条数据库吧!花了大约3-5分钟,前端也会出现超时请求问题、让我意识到一条一条插入影响性能,但是因为业务逻辑的需要,又不得不一条一条插入,后面改变了思维还是必须批量插入数据!并将其他表也需要保存的数据也临时存在Java对象中!在主对象保存之后进行遍历获取插...
今天在利用excel处理业务数据的时候开始打算一条一条插入数据库!因为要做数据校验和数据保存返回id之后进行其他表也插入!大约有30000多条数据库吧!花了大约3-5分钟,前端也会出现超时请求问题、让我意识到一条一条插入影响性能,但是因为业务逻辑的需要,又不得不一条一条插入,后面改变了思维还是必须批量插入数据!并将其他表也需要保存的数据也临时存在Java对象中!在主对象保存之后进行遍历获取插入。
一条一条数据插入为什么会这么慢呢?如果是单条执行数据操作,比如有30000条数据,那么你得向数据库服务器发起30000次请求!如果使用批量插入就只需要发送一次请求。
其实就像前端发送http请求一样,在请求的时候消耗花费了很多时间。
直接看一下批量保存的源代码吧
public boolean saveBatch(Collection<T> entityList, int batchSize) {
String sqlStatement = this.sqlStatement(SqlMethod.INSERT_ONE);
SqlSession batchSqlSession = this.sqlSessionBatch();
Throwable var5 = null;
try {
int i = 0;
for(Iterator var7 = entityList.iterator(); var7.hasNext(); ++i) {
Object anEntityList = var7.next();
batchSqlSession.insert(sqlStatement, anEntityList);
if(i >= 1 && i % batchSize == 0) {
batchSqlSession.flushStatements();
}
}
batchSqlSession.flushStatements();
return true;
} catch (Throwable var16) {
var5 = var16;
throw var16;
} finally {
if(batchSqlSession != null) {
if(var5 != null) {
try {
batchSqlSession.close();
} catch (Throwable var15) {
var5.addSuppressed(var15);
}
} else {
batchSqlSession.close();
}
}
}
}
<insert id="insertAccountabilityUsers" parameterType="AccountabilityUsersModel" useGeneratedKeys="false">
INSERT INTO accountability_users
(
accountability_user_id, accountability_id, to_username,
record_status, created_by, created_at, updated_by, updated_at
)
VALUES
<foreach collection="usersList" item="model" separator=",">
(
#{model.accountabilityUserId}, #{model.accountabilityId}, #{model.toUsername},
'A', #{model.createdBy}, #{model.createdAt}, #{model.updatedBy}, #{model.updatedAt}
)
</foreach>
</insert>
这里 batchSqlSession.flushStatements() 其实就是在做拼接SQL的操作!将单个插入的方法为每个实体组装一个insert 语句,然后执行数据库插入操作、在数据量级不是特别大的时候推荐使用foreach方式,在数据量级非常大的时候可以使用BATCH方式。批量插入请勿使用循环insert的方式进行
大家点赞、收藏、关注、评论啦 、 打卡 文章 更新 298/ 365天
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)