尝试针对 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.schemaspring.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 数据库的主要内容,如果未能解决你的问题,请参考以下文章

针对多个表优化缓慢的 postgresql 查询

Oracle, PostgreSQl, MySQL针对INSERT时可能唯一键重复的SQL

针对特定用户的 PostgreSQL RLS 策略未按预期工作并适用于所有用户

在 node.js 中导入 sql 文件并针对 PostgreSQL 执行

聚合级别已关闭(Postgresql)

Docker Compose 无法从数据库 (jdbc:postgresql://db:5432/postgres) 为用户“postgres”获取连接:连接尝试失败