Spring Batch切换Oracle 11g后JobRepository隔离级别配置报错求助
解决Spring Batch JobRepository隔离级别配置报错的问题
你遇到的IllegalArgumentException: Invalid transaction attribute token: [READ_COMMITTED]错误,核心原因是Spring Batch的JobRepositoryFactoryBean.setIsolationLevelForCreate()方法需要传入的是Spring TransactionDefinition接口中定义的隔离级别常量的字符串形式——也就是要带ISOLATION_前缀,而不是直接写READ_COMMITTED。
正确的JobRepository配置示例
直接修改你重写的createJobRepository()方法,把隔离级别参数改成"ISOLATION_READ_COMMITTED"即可:
public class BatchConfiguration extends DefaultBatchConfigurer { @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired private PlatformTransactionManager transactionManager; @Autowired public StepBuilderFactory stepBuilderFactory; @Autowired private DataSource dataSource; @Override protected JobRepository createJobRepository() throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(dataSource); factory.setTransactionManager(transactionManager); // 修正:使用带ISOLATION_前缀的标准隔离级别字符串 factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED"); // 如果你的Spring Batch系统表有自定义前缀,取消注释下面的配置 // factory.setTablePrefix("BATCH_"); factory.setMaxVarCharLength(1000); // 建议手动调用afterPropertiesSet()确保初始化完成 factory.afterPropertiesSet(); return factory.getObject(); } @Bean public JdbcCursorItemReader<BusnPrtnr> itemReader() { return new JdbcCursorItemReaderBuilder<BusnPrtnr>() .dataSource(dataSource) // 你的其他配置代码... .build(); } // 你的其他Batch配置(Job、Step等)... }
额外优化:Spring Boot配置文件方式
如果是Spring Boot项目,你也可以不用重写createJobRepository(),直接在配置文件中设置,更简洁:
application.properties
# 设置JobRepository创建时的隔离级别 spring.batch.job.repository.isolation-level-for-create=ISOLATION_READ_COMMITTED # 可选:如果你的系统表有自定义前缀 # spring.batch.job.repository.table-prefix=BATCH_
application.yml
spring: batch: job: repository: isolation-level-for-create: ISOLATION_READ_COMMITTED # 可选:自定义表前缀 # table-prefix: BATCH_
为什么Oracle 11g会有这个问题?
HSQLDB默认的事务隔离级别和Spring Batch默认的ISOLATION_SERIALIZABLE兼容性较好,但Oracle 11g对Serializable隔离级别的实现更为严格,在插入Spring Batch系统表时容易出现锁等待或事务异常,所以调整为ISOLATION_READ_COMMITTED是适配Oracle的常用方案。
内容的提问来源于stack exchange,提问作者CardsFan
相关产品推荐
相关产品推荐

