【发布时间】:2019-01-09 22:19:35
【问题描述】:
在我的 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参数为false的情况下,ps.executeBatch()之后不应更新。
由于 Spring 批处理应该管理事务和提交。我试图找到它在哪里提交,以便更好地理解我遇到的问题。期待ChunkOrientedTasklet、SimpleChunkProcessor 和TransactionTemplate我找不到它在提交过程中的哪个位置。
所以我的第二个问题是,Spring 批处理在面向块的过程中准确提交到哪里?
编辑:使用 Spring 批处理 3.0.7
EDIT :似乎在AbstractPlatformTransactionManager.processCommit(DefaultTransactionStatus status) 中处理,但仍然无法理解如何处理。
【问题讨论】:
标签: java spring-batch commit spring-jdbc spring-transactions