【问题标题】:How to save jpa entities on application shutdown?如何在应用程序关闭时保存 jpa 实体?
【发布时间】:2022-11-23 15:34:02
【问题描述】:

我有一项服务使用 H2 数据库处理实体的 CRUD 操作。以前在测试阶段我曾经有一个 csv 文件,它“充当”数据库并且在应用程序关闭时我将所有内存中的实体更改保存到这个 csv 文件。现在我想做同样的事情,但出于某种原因,我没有在我的 onExit() 方法中遇到任何断点,因此没有在应用程序关闭时保存数据。我仍在制定正确的选择逻辑哪个要保存的实体,但现在我只想在按下 Intellij 中的停止“应用程序”按钮时能够自动保存。

@Component
public class MangaDataProvider {

  private static MangaService mangaService;

  @Autowired
  public MangaDataProvider(MangaService mangaService) {
    MangaDataProvider.mangaService = mangaService;
  }

  @PreDestroy
  public static void onExit() {
    mangaService.saveAll();
  }
}

然后我在 Application 中有一个 onExit() 方法:

@SpringBootApplication
public class Application extends SpringBootServletInitializer implements AppShellConfigurator {

  public static void main(String[] args) {
    LaunchUtil.launchBrowserInDevelopmentMode(SpringApplication.run(Application.class, args));
  }

  @PreDestroy
  public void onExit() {
    MangaDataProvider.onExit();
  }
}

【问题讨论】:

    标签: java spring-boot jpa


    【解决方案1】:

    无法保证关闭挂钩将被执行。他们执行的时间非常有限。这意味着您的代码可能会被部分执行。您可以尝试添加打印语句或调试断点。您会观察到第一个语句已执行,因为它非常快,但没有时间执行该方法的其余部分。
    我的好做法是调用服务或端点“准备”(在您的情况下,它将保留您的数据)您的应用程序以关闭。您调用此服务/端点,然后在执行完成后,您可以安全地终止应用程序。
    许多服务器应用程序都有一个“准备关闭”端点。每个例子詹金斯;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2013-05-10
      相关资源
      最近更新 更多