在Spring + mysql中具有ACID属性的BatchUpdate

时间:2012-07-11 07:46:30

标签: java mysql spring jdbctemplate

目前我们的应用程序使用Spring,SimpleJdbcTemplate&的MySQL。

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

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

在重复记录方案下可以

  

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

OR

  

2)完全回滚batchInsert,不应插入任何记录吗?

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

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

是否可以在第一行中提到的我们正在使用的组件的约束下实现上述两种情况之一?

我是spring和jdbc世界的新手,所以详细的解释会对我们有所帮助。 感谢

1 个答案:

答案 0 :(得分:1)

  

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

=&GT;那么你可以插入所有的non.duplicate记录,并获得响应。 batchUpdate()返回int[],即整数数组,表示批处理中每次更新所影响的行数(插入/更新)。

  

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

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