尝试针对 PostgreSQL 数据库为 Spring 开发设置 H2 数据库
Posted
技术标签:
【中文标题】尝试针对 PostgreSQL 数据库为 Spring 开发设置 H2 数据库【英文标题】:Trying to set up a H2 database for Spring development against a PostgreSQL database 【发布时间】:2020-09-24 09:50:13 【问题描述】:我正在设置一个小型 SpringBoot 应用程序,它将使用 PostgreSQL 作为数据库。我的开发想法是使用 H2 嵌入式数据库“作为”Postgre 数据库,但我并不真正了解我需要做什么来设置所有内容:
1) 以防万一,我们使用 Gradle 进行依赖管理:
compile group: 'com.h2database', name: 'h2', version: '1.3.148'
compile group: 'org.springframework', name: 'spring-jdbc', version: '5.2.6.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.3.0.RELEASE'
2) 这是我的 application-dev.properties(“dev”是我正在运行应用程序的配置文件)(在下面的评论和阅读 this other question 后更新):
spring.datasource.url=jdbc:h2:mem:testdb;MODE=PostgreSQL
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.datasource.schema=classpath:/sql/schema.sql
spring.datasource.data=classpath:/sql/data.sql
spring.datasource.initialize=true
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
3)(更新)schema.sql 是我们的数据库创建脚本,data.sql 是数据脚本(显然),两者都在 /resources/sql 中。
这里的问题是应用程序启动,它加载配置文件(The following profiles are active: dev
),但是当进入 h2 控制台时,数据库是空的。我什至尝试更改脚本的名称(更改为“_ddl.sql”)并且应用程序只是启动相同,就好像它甚至没有尝试查找文件一样。
另外,登录时在 H2 控制台选项上标记GenericPostgreSQL
是否有意义?
关于我在这里缺少什么的任何线索?
【问题讨论】:
您可以删除属性文件中的spring.datasource.data
条目并将您的sql 脚本重命名为data.sql
,看看您的数据库是否以这种方式填充。请注意,它不应该包含任何 DDL - 您可以使用 schema.sql
。
好的,给我的文件包含架构和数据。我已经分离了内容并重命名了文件(现在我得到了 data.sql 和 schema.sql),删除了 spring.datasource.data 条目,但文件仍然没有加载。
【参考方案1】:
如果您的数据库创建脚本位于ddl.sql
,则属性文件中的正确条目应为spring.datasource.schema
。 spring.datasource.data
用于在应用程序启动期间将初始数据加载到数据库中。你把它们混在一起了。
【讨论】:
看来,只要我添加“spring.datasource.schema”行,应用程序就会在启动时崩溃,因为Error creating bean with name 'h2Console' defined in class path resource [org/springframework/boot/autoconfigure/h2/H2ConsoleAutoConfiguration.class]
我想我会检查这个错误,因为似乎还有更多设置做...
我对 h2 控制台不熟悉,也许这对你有帮助? ***.com/questions/48564043/… 否则你可以使用H2ConsoleAutoConfiguration
检查它无法创建bean的原因,你可以在stacktrace中找到它,这会有所帮助【参考方案2】:
嗯,我有点解决了。
这似乎是混合依赖项和非常长的错误消息的问题。这些依赖的“最终”状态如下:
compile group: 'com.h2database', name: 'h2', version: '1.3.148'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.3.0.RELEASE'
我(也)在使用 spring-jdbc,它似乎与 spring-boot-starter-jdbc 发生冲突。
现在,最重要的部分是what I read here,因为我意识到现在我遇到的错误涉及语法问题:基本上,H2 和 PostgreSQL 并不是真正的好朋友,最好只使用 PostgreSQL 数据库进行本地开发。求救。
【讨论】:
尽管我同意最好在不同环境之间使用相同的堆栈,但我在开发的早期阶段使用 H2 从来没有遇到过问题,所以我鼓励你继续使用它只要方便。 Hibernate 在抽象出底层数据库方面做得非常好。 问题是我处于最早的开发阶段。我收到的 SQL 文件在第二行中停止工作,鉴于我唯一的经验是使用 Oracle,我将继续做更多的研究,创建一个本地 postgre 数据库并继续前进。很遗憾,因为 H2 选项似乎非常优雅,但是... 最好在生产和测试中使用相同的 DBMS,但是如果您想在测试中使用 H2,您至少应该使用一些最新版本,例如 1.4.200,版本 1.3.148大约 10 年前发布。以上是关于尝试针对 PostgreSQL 数据库为 Spring 开发设置 H2 数据库的主要内容,如果未能解决你的问题,请参考以下文章