我一直在尝试创建一个Spring批处理程序,该程序必须从数据库中读取某些数据并将其写入另一个表中。我不希望在数据库中创建 Spring 批处理元数据表。当我尝试这样做时,我无法进行交易。
我通过扩展DefaultBatchConfigurer
并像这样覆盖来避免元数据表,
@Override
public void setDataSource(DataSource dataSource) {
// override to do not set datasource even if a datasource exist.
// initialize will use a Map based JobRepository (instead of database)
}
通过这样做,我得到了org.springframework.dao.InvalidDataAccessApiUsageException: no transaction is in progress; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress
例外。
有没有办法避免元数据表并仍然使用事务?
- 如果您使用的是 Spring 引导,则可以将以下行添加到 application.properties 或特定于环境的属性文件中,以确保不会创建 spring 批处理元数据表:
spring.batch.initializer.enabled=false
-
另外,由于您不需要元表,因此不要扩展
DefaultBatchConfigurer
类。 -
如果我想设置一个持久
JobRepository
即创建 spring batch 元表,我只会扩展这个类,为此我们需要DefaultBatchConfigurer
类默认提供的许多其他配置。