如何在SpringBoot下关闭SpringBatch的JPA

时间:2017-04-12 16:00:38

标签: spring-boot spring-integration spring-data-jpa spring-batch

我们有一个使用Spring Integration和Spring Batch的Spring Boot应用程序。我们在轮询器中删除一个文件并进行处理。此过程将记录插入到数据库中,然后将它们读回来进行一些处理并写入文件。假设有10条记录。我们第一次读取10条记录,写入10条记录。在不停止服务器的情况下,我们通过数据库上的SQL客户端删除所有记录,再次运行相同的文件,我们得到10条记录,其中20条写入。我相信数据源会有一些JPA或缓存。我们已经尝试关闭JPA和缓存的几个自动配置选项,但我们没有找到正确的配置选项来关闭缓存。

在问题中添加更多细节。

基本上我们有cron调度程序,它有一个FileHandler。这个handleFile方法我们有以下几点。

public File handleFile(File file) throws Throwable {
    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
    Job job = (Job) appContext.getBean("processInitialFileJob");
    JobExecution jb = jobLauncher.run(job, jobParametersBuilder.toJobParameters());
    ....
}

我们可以对上面的代码做些什么来确保它有一个新的JPA会话或根本不使用JPA会话?此作业需要每次都从数据库中读取,而不是数据库的缓存表示。

2 个答案:

答案 0 :(得分:0)

您使用的是Hibernate吗? Hibernate First Level缓存可能会为您创建问题。 Hibernate管理会话本地的一级缓存。所以一旦你创建一个会话并在那个hibernate同步中做任何事务。但是当你对hibernate之外的表做任何更改时,hibernate将不会同步,直到在会话上调用flush并且会话关闭。

为确保不会发生这种情况,请在轮询器逻辑内尝试创建新的Session(或JPA时的EntityManager)并关闭每个读取/处理/写入周期的会话。

还要确保此hibernate.current_session_context_class未设置为Thread。由于轮询可以被轮询器重用,因此可以再次注入相同的Hibernate会话。

答案 1 :(得分:0)

这最终不是Hibernate或JPA的问题,而是一个StringBuilder的问题,它坚持以前运行的数据。我相信这需要设置为@JobScope,以便它不会在作业的不同执行中重复使用。