1

目前我们的应用程序使用 Spring、SimpleJdbcTemplate 和 MySQL。

使用的数据源是 org.apache.commons.dbcp.BasicDataSource,其 url 属性为“rewriteBatchedStatements=true”。

在使用 进行批量插入期间,输入批次SimpleJdbcTemplate.batchUpdate(List<Object[]>)中将存在重复记录(基于我们正在插入的表的主键)。

在重复记录的情况下是否可以

1) 插入所有非重复记录并得到关于成功插入次数的响应?

或者

2)完全回滚batchInsert,不应该插入记录?

我们能够使用 mysql 的“INSERT IGNORE”部分实现第一个要求。但是SimpleJdbcTemplate.batchUpdate()返回更新的每条记录。(无法仅捕获插入的记录计数而忽略重复项)

为了实现第二个要求,我们必须关闭“rewriteBatchedStatements”。但是这个参数经过性能测试后已经微调了。所以我们不能把它设置为“假”。

在第一行中提到的我们使用的组件的约束范围内,是否有可能实现上述两种情况之一?

我是spring和jdbc世界的新手,所以详细的解释会更好地帮助我们。谢谢

4

1 回答 1

1

1) 插入所有非重复记录并得到关于成功插入次数的响应?

=> 你可以,插入所有非重复记录,然后得到响应。batchUpdate()返回int[]即整数数组,表示受批处理中每次更新影响的行数(插入/更新)。

2)完全回滚batchInsert不应该插入记录?

=> 由于 batchInsert 将在单个事务中,因此将插入所有记录或不插入任何记录。如果事务被提交,所有记录都将被插入。@Transactional如果发生任何异常,如果您使用 Spring 事务管理(使用注解或spring aop based tx advice),事务将自动回滚。在这里确保,您设置了BasicDataSource.defaultAutoCommit = false.

于 2012-07-11T09:29:27.820 回答