0

我有一个要使用我的诱饵插入数据库的记录列表。以前,我的代码是这样的:

for(Item item :  items){
    sqlSession.insert("insert", item);
}

Mysql使用这种方法是可行的,但我发现由于项目数量的原因,服务器上存在动态增量 DiskIO 。

由于我很少访问 MySql 配置,并希望解决这个高磁盘 io 问题,我找到了一些可能的解决方案:

  1. 用于ExecutorType.BATCH_sqlSession
  2. 在单个插入语句中插入多个值,例如: insert into Item values <foreach collection="list" item="item" index="index" separator=","> (#{item.a}, #{item.b}...) </foreach>

有谁知道哪一个适合解决我的高磁盘IO问题以及这两种解决方案之间的主要区别是什么?谢谢。

4

1 回答 1

0

虽然很难预测对服务器磁盘 I/O 的影响,但方法 1(使用ExecutorType.BATCH)是推荐的方法。
它基本上一次插入一定数量的项目。
由于它在内部使用 JDBC 的批处理操作 API,该 API 旨在处理多行,因此您可以从驱动程序的优化中受益。

笔记:

方法 2(多行插入)执行一次绑定所有项目的单个语句。
它可能会导致内存问题。

于 2019-05-08T11:48:58.543 回答