Spring Boot with H2 每次 web 应用启动时都会运行 data.sql,这正常吗?

Posted

技术标签:

【中文标题】Spring Boot with H2 每次 web 应用启动时都会运行 data.sql,这正常吗?【英文标题】:Spring Boot with H2 is running data.sql every time the web app starts, is this normal? 【发布时间】:2020-11-22 18:27:45 【问题描述】:

我有一个带有嵌入式 H2 数据库的 Spring Boot 应用程序(配置为将数据库保存到磁盘)。

我有一个 SQL 文件 data.sql,如果它不存在,它会创建一个 users 表,并在 users 表中插入一个 admin 帐户。

data.sql 在应用启动时自动运行,一切正常。

问题是,每次应用程序启动时它都会运行data.sql,并在users 表中创建另一个admin 记录。

问题:如何配置它,使其仅在数据库尚不存在时运行data.sql

我在application.properties文件中的设置是这样的,所以数据会被保存到磁盘,然后运行data.sql文件来创建数据库...

spring.datasource.url=jdbc:h2:file:./data/myapplication-1.0
spring.jpa.hibernate.ddl-auto=update

【问题讨论】:

【参考方案1】:

使用 H2 的 Spring Boot 每次启动 web 应用时都会运行 data.sql,这是正常的吗?

是的!这是预期行为。如果存在任何data.sql 文件,H2 旨在每次加载数据。因为H2是内存数据库,预计程序退出后数据不会持久化。这就是为什么每次都会加载数据的原因。如果您想要一些自定义,您需要以编程方式检查它,或者data.sql 文件中应该存在逻辑(如果值存在则更新否则插入)。

也有简单的方法,数据初始化后,设置一个新的配置值,这样就不会从data.sql文件中加载数据了。

您可以使用属性spring.datasource.initialization-mode=never 来停止每次加载数据库。

参考: 79.3 Initialize a Database

【讨论】:

以上是关于Spring Boot with H2 每次 web 应用启动时都会运行 data.sql,这正常吗?的主要内容,如果未能解决你的问题,请参考以下文章

Non-blocking Spring Boot with Kotlin Coroutines

spring-boot 文件系统中的持久 h2 数据库

Spring boot - h2 DB 测试多次执行脚本

Spring boot: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName

如何使用 Spring-Boot 播种 Spring-Security

在 Spring Boot 应用程序上使用 Flyway 时如何在 H2 中加载初始数据?