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: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName