【问题标题】:How to turn off JPA for SpringBatch under SpringBootSpringBoot下如何关闭Spring Batch的JPA
【发布时间】:2017-09-08 12:33:36
【问题描述】:

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

为问题添加更多细节。

基本上我们有一个带有 FileHandler 的 cron 调度程序。这个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 会话?该作业每次都需要从数据库中读取,而不是数据库的缓存表示。

【问题讨论】:

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


    【解决方案1】:

    你在使用 Hibernate。 Hibernate 一级缓存可能会给你带来问题。 Hibernate 管理 Session 本地的一级缓存。因此,一旦您创建会话并在该休眠状态中执行任何事务,就会在其中同步。但是当你在休眠之外对表进行任何更改时,休眠将不会同步,直到在会话上调用刷新并且会话关闭。

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

    还要确保这个 hibernate.current_session_context_class 没有设置为 Thread。由于线程可以被轮询器重用,因此可以再次注入相同的 Hibernate Session。

    【讨论】:

    • 我有一种预感,那就是问题所在。有没有办法完全关闭它?所以基本上如果我对表格进行读取,我希望它实际读取表格而不是表格的缓存表示。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2010-12-09
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多