Spring JdbcTemplate批量更新的快速替代方案

3
我想通过Spring JDBC模板批量更新将大约5000个值插入到MySql表中,就像这里所示的那样。http://www.mkyong.com/spring/spring-jdbctemplate-batchupdate-example/ 我理解它在一个事务中根据我提供的行数执行相同数量的插入操作。但是速度仍然很慢。我尝试过编写如下的查询语句:
INSERT INTO CUSTOMER " +
    "(CUST_ID, NAME, AGE) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?),(?, ?, ?)....

对于我拥有的许多行数据,手动构建查询语句虽然更快,但我想知道在这种情况下是否有批量更新的其他替代方案?

附注:我知道应该考虑最大包大小,在构建如此大的查询时,查询的大小不应超过限制(尽管可以在MySQL服务器中配置限制)。


你尝试过使用 preparedStatement.addBatch(); preparedStatement.executeBatch(); 吗? - Xstian
是的,没有显著的影响。 - lopushen
为了使批量更新起作用,请确保您拥有支持它的JDBC驱动程序版本(和数据库),如果不支持,则将执行单个查询而不是批处理。此外,请确保您已经设置了适当的事务并且正在使用事务表。 - M. Deinum
1个回答

2

您可以按照以下步骤进行操作

  1. 获取连接对象
  2. 使用connection.autocommit(false)将连接的自动提交属性设置为false。
  3. 运行您的插入查询语句。
  4. 执行connection.commit();

好观点!虽然比组成一个大查询慢,但是结果证明可以将操作加速到相当的速度。谢谢! - lopushen
通过适当的事务设置,这是不必要的,因为Spring tx已经做到了这一点。如果这是有效的,主要表明您的设置存在问题。 - M. Deinum
看这个示例,首先它有一个问题,就是没有正确的事务设置。insertBatchSql方法应该是事务性的,但实际上它不是,从示例中可以看出完全缺乏事务设置。 - M. Deinum
以上方法有什么缺点吗? - Viraj
它的效果非常好!我曾经使用addBatch()insertBatch(),但性能非常差。现在持续时间从1分钟降至1秒钟!谢谢! - Hugo
@M.Deinum 这个方案在以下场景中也适用吗?https://stackoverflow.com/questions/65062510/will-transactional-cause-batch-updates-with-jdbctemplate-if-used-in-a-loop - Sameer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接