当前位置: 首页 > 知识库问答 >
问题:

具有多个数据源的spring批处理junit。spring data jpa无法在内存数据库中保存数据

钱劲
2023-03-14

我的场景是,批处理作业应该从1db(H2)读取数据,并将数据转储到另一DB(postgres)中。因此,我配置了多个数据源

我已经使用spring batch 4.2和spring boot 2.2.5编写了批处理作业。释放现在我需要为端到端测试编写测试用例。

我使用ResourcelessTransactionManager使用自定义批处理配置器来避免在内存和实际数据库中保存批处理表元数据,并且它正在工作。但是,我无法通过调用readerRepository.save来将业务数据保存在jUnit中的H2内存数据库中;如果我将H2内存数据库替换为jUnit中的postgres testconatiner,情况也是如此。

存储库测试的junit示例

@Slf4j
@SpringBootTest
@Import(LiquibaseConfigReader.class)
class ReaderRepositoryTest {

    @Autowired
    private ReaderRepository readerRepository;

    @BeforeEach
    void setUp() {
        readerRepository.deleteAll();
    }

    @Test
    void shouldFetchAllRecords() {
        var randomReader = RandomDataGenerator.randomReader();
        assertThat(readerRepository.findAll()).hasSize(0);
        readerRepository.save(randomReader);
        assertThat(readerRepository.findAll()).hasSize(1);
    }
}

我无法理解为什么我能够在运行JUnit Test时将数据保存在postgres测试容器中,而不是在内存H2数据库中。

为了将批处理表元数据保存在内存映射中,我尝试了下面的解决方案,现在批处理表元数据没有保存在DB中的任何位置。但是,如上所述,我开始在jUnit中面临Spring data jpa问题。

JavaSpring Batch使用嵌入式数据库处理元数据,第二个数据库处理其他数据

无数据源的Spring boot Spring批处理

https://github.com/riversoforion/spring-batch-inmem/blob/master/src/main/java/com/example/batch/CustomBatchConfigurer.java

是因为ResourcelessTransactionManager吗?如果是,我如何避免将批处理表元数据保存在任何数据库中,包括内存中。

我已经浏览了这里给出的多个问题,但没有一个能够将业务数据保存在h2数据库中。

共有1个答案

谷梁建中
2023-03-14

没有源代码很难回答。据我所知,您希望有一个DB从(H2)读取数据,一个将数据写入(postgres)。

您不希望Spring batch在两个数据库中都写入元数据。

然后你写,你不明白为什么你不能写H2——我想,你这里指的只是spring批处理元数据。

因此,一个可能的解决方案可能是更改批处理配置器:

...
public class CustomBatchConfigurer extends DefaultBatchConfigurer {

    @Autowired
    @Qualifier("repoDataSource")
    private DataSource dataSource;

    @Override
    protected JobRepository createJobRepository() throws Exception {
        JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
        factoryBean.setDatabaseType(DatabaseType.POSTGRES.getProductName());
        factoryBean.setTablePrefix("TMP_");
        factoryBean.setIsolationLevelForCreate("ISOLATION_REPEATABLE_READ");
        factoryBean.setDataSource(this.dataSource);
        factoryBean.afterPropertiesSet();
        return factoryBean.getObject();
    }

在这里,您自动连接数据源repoDataSource,然后覆盖createJobRepository(),而DefaultBatchConfigurer使用它来创建JobRepository。它使用一个表前缀TMP,而不是默认的BATCH,事务隔离级别设置为ISOLATION\u REPEATABLE\u READ,而不是默认的ISOLATION\u SERIALIZED

Spring没有直接调用DefaultBatchConfigurer中的任何create-方法作为bean定义,因此必须明确地调用初始化bean FactoryBean getObject()

如果您真的不想让Spring Batch完成大部分工作,并帮助批次管理其元数据,那么您的问题是,在不将元数据持久化到数据库的情况下,可能会复制Spring Batch。

 类似资料:
  • 我正在尝试设置Spring Boot以使用多个数据源。我已按照设置两个数据源的说明并将其中一个设置为主要数据源。 我有一个oracle的第二个配置类,它缺少@主注释,但非常相似。我还将其添加到我的主类中以排除数据源自动配置。 我面临的问题是,此设置不允许我的集成测试在H2数据库上运行以打开连接。。。 我正在使用一个单独的应用程序。src/integrationtest/resources下的属性文

  • 我尝试实现Spring Batch。在这里,我试图将数据从文本文件保存到数据库中。我在处理的时候得到了NPE。 在这里,我使用JPARepository将文本文件数据保存到自定义writer类中的数据库中。此处StudentRepo为空。 为什么是空的?我尝试了另一种方法,用同样的方法手工存储在数据库中,没有问题。只有在writer类中,它是空的。

  • 我使用Spring批处理从Oracle数据库读取数据并将结果写入CSV文件。 我还需要将spring批处理元数据表与oracle数据库分开,为此,我在批处理配置中配置了两个不同的数据源(spring批处理元数据的内存数据库)。 这是我的代码: 批处理配置。JAVA 然后我的itemReader bean看起来像: 当我运行批处理时,一切正常。 但是当我尝试在我的BatchApplication中添

  • 我使用的是由java.sql引起的相同代码:na]。SQLSyntaxErrorException:ORA-00942:表或视图不存在-Spring批处理,无法将记录保存到数据库中。 我已经创建了表 LifeCycleStatusWriter.java 作家 错误: 配置详细信息 数据库配置

  • 我必须在表中的一些配置数据库中爬行。其中每个记录指定要从中读取的模式。因此,我们必须对表格进行投票,并适当地运行作业。 考虑使用Spring批处理(JdbcPagingItemReader)从所有配置的模式中读取数据。如果我必须配置它,如何使用Spring批处理? 我应该使用不同的读取器为每个数据库读取多个作业,还是有什么方法可以在运行时发送数据源以供Spring Batch读取数据? 如何为单个

  • 我正在使用Spring Batch和JPA处理一个批处理作业并执行更新。我正在使用默认的存储库实现。 并且我正在使用一个repository.save将修改后的对象保存在处理器中。而且,我没有在处理器或编写器中指定任何@Transactional注释。 下面是我的步骤,读取器和写入器配置:另外,我的config类是用EnableBatchProcessing注释的 在writer中,这就是我使用的