3

我需要在 Spring jdbc 中使用 NamedParameterJdbcTemplate 执行 1kk+ 行的批量插入。所以我的代码是这样的:

public void insert(Collection<Person> entities) {
    SqlParameterSource[] params = SqlParameterSourceUtils.createBatch(entities.toArray());
    namedJdbcTemplate.batchUpdate(insertSql, params);
}

实际上,我对 5 个相关的不同表使用批量插入。所以这里的问题是,如果我为这些表中的一个插入大约 1kk 行,应用程序。尝试多次插入它们,然后给我 OutOfMemoryError。我认为这是因为我没有提供批量大小值(有点像提供的总行集合的一部分行,这些行将在插入后提交),但我不知道如何通过我的 NamedParameterJdbcTemplate 值设置此参数。

或者也许还有其他建议如何完成?

谢谢

更新:我在我的配置中使用 SimpleDataSource 和 DataSourceTransactionManager

更新:我尝试使用 SingleConnectionDataSource 并调用方法 setAutoCommit(false)。然后,在上面的代码中对 100k 行进行批处理更新后,我调用了:

try {
            ((JdbcTemplate)  dbTemplate.getJdbcOperations()).getDataSource().getConnection().commit();
        } catch (SQLException e) {

}

它工作得更好,但这对我使用这样的代码不利。也许还有另一个更好的解决方案?对于 1kk 行,它仍然说没有足够的内存来执行批处理更新。

4

0 回答 0