在我的 java 项目中,我有一个使用 Spring boot 的面向块的读取 ( FlatFileItemReader) - 写入 ( JdbcBatchItemWriter) 过程。使用HikariCp数据源。
查看 Spring 批处理 jdbc 编写器,我们可以找到该部分:
//some code
@Override
public int[] doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
for (T item : items) {
itemPreparedStatementSetter.setValues(item, ps);
ps.addBatch();
}
return ps.executeBatch();
}
//some code
所以基本上在这里,如果我的 Hikari 数据源的setAutocommit参数为true,则意味着在ps.executeBatch()我的数据库将被更新之后。
这里的第一个问题是,PreparedStatement.executeBatch() 它究竟是如何处理的?它是提交每个 sql 语句还是在每个 sql 语句的末尾?
在该情况下,setAutocommit参数是假的,之后ps.executeBatch()它不应该被更新。
由于 Spring 批处理应该管理事务等提交。我试图找到它在哪里提交以便更好地理解我遇到的问题。展望ChunkOrientedTasklet,SimpleChunkProcessor和TransactionTemplate我找不到在哪里的过程中它的承诺。
所以我的第二个问题是,Spring 批处理在面向块的过程中究竟在哪里提交?
编辑:使用 Spring 批处理 3.0.7
编辑:似乎已处理AbstractPlatformTransactionManager.processCommit(DefaultTransactionStatus status)但仍然无法理解。
森林海
繁星coding
相关分类