【问题标题】:How to reload Initial Data in running Spring Boot applicaiton?如何在运行 Spring Boot 应用程序中重新加载初始数据?
【发布时间】:2020-12-03 15:16:55
【问题描述】:

我在我的网络应用程序中使用spring-boot-starter-data-jdbc 依赖项。 Spring Boot 可以在应用程序启动时自动创建模式并从根类路径位置 schema.sqldata.sql 对其进行初始化,但我很好奇是否有任何方法可以在应用程序之后使用相同的 sql-scripts 重新初始化数据库已经开始了吗?

我在演示模式下需要此功能,以便用户在玩了足够多的表格后可以将数据库重置为初始状态。这就是我希望我的重置控制器的样子:

@Controller
@RequestMapping("/reset")
@Profile("demo")
public class ResetController {

    @GetMapping
    public String resetTables(HttpSession session) {
        // some code re-initializing the database 
        // form schema.sql and data.sql goes here
        session.invalidate();
        return "redirect:/home";
    }
}

我知道,我总是可以使用JdbcTemplate 及其方法手动删除、创建和重新填充每个表,遵循schema.sqldata.sql 中定义的sql 语句的逻辑,但这会有点乏味。也许,Spring 有一些开箱即用的方法来针对数据库执行这些脚本,这将有助于重新加载带有初始演示数据的表?

更新:

这是基于Flyway 迁移的可能解决方案之一,正如 Charles B 在接受的答案中所建议的那样:

  1. flyway-core 依赖添加到项目中。
  2. 按照 Flyway 命名要求将 schema.sqldata.sql 重命名为 V1__schema.sqlV2__data.sql,并将它们放在 /resources/db/migration 目录下。
  3. spring.flyway.baseline-on-migrate 属性设置为true
  4. 然后,可以重写上面描述的复位控制器,就像这样简单:
@Controller
@RequestMapping("/reset")
@Profile("demo")
public class ResetController {

    private final Flyway flyway;

    public ResetController(Flyway flyway) {
        this.flyway = flyway;
    }

    @GetMapping
    public String resetTables(HttpSession session) {
        flyway.clean();
        flyway.migrate();
        session.invalidate();
        return "redirect:/home";
    }
    
}

此外,对于不同的迁移场景,可以设置 spring.flyway.locations 属性引用不同的 SQL 文件 - 分别为每个配置文件,甚至通过将 spring.flyway.enabled 属性设置为 false 来禁用某些配置文件的 Flyway 迁移。

【问题讨论】:

    标签: java spring spring-boot spring-jdbc


    【解决方案1】:

    如果您迁移到 Flyway 之类的东西,您可以构建一个控制器来调用 flyway 的 clean 方法,如引用的 here。易于迁移和长期维护。

    【讨论】:

    • 谢谢。它有效,实施起来并不费力。根据您的建议,我用简短的说明更新了我的原始帖子。
    【解决方案2】:

    您可以尝试使用 Spring Boot Actuator 端点来重新启动整个应用程序。这应该会重新初始化您的 ORM 并重置数据库初始状态。

    依赖:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    配置:

    management:
      endpoints:
        web:
          exposure:
            include: restart
      endpoint:
        restart:
          enabled: true
    

    您应该能够访问/actuator/restart 端点。

    http://localhost:8080/actuator/restart
    

    【讨论】:

    • 老实说,我宁愿避免重新启动整个应用程序。否则,当应用程序变得不可访问(即使是片刻)以及下一步该做什么时,用户可能会感到困惑。它还需要用户采取一些额外的操作(例如重新加载页面或类似的操作)才能回到正轨。我希望让用户的这个过程尽可能顺利,比如:用户点击“重置”按钮,在控制器完成重新初始化后自动重定向到主页。
    【解决方案3】:

    Spring Boot 让以简单的方式管理我们的数据库更改变得非常容易。 我们可以使用 Spring 中的 data.sql 和 schema.sql 文件。

    如果我们运行我们的应用程序,Spring Boot 将为我们创建一个空表,但不会填充任何内容。

    更多细节在这里 -> https://www.baeldung.com/spring-boot-data-sql-and-schema-sql

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 2016-10-28
      • 1970-01-01
      • 2016-05-24
      • 2018-05-20
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      相关资源
      最近更新 更多