更新到 Spring Boot 2.4.0 后内存数据库中的 H2 不工作
H2 in memory database not working after update to SpringBoot 2.4.0
我有一个 SpringBoot 应用程序,它使用 H2 内存数据库进行集成测试。如果我在 versino 2.3.4.RELEASE 中使用 SpringBoot,则测试有效。如果我升级到 2.4.0 并出现以下错误,它们将失败:
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Driver com.microsoft.sqlserver.jdbc.SQLServerDriver claims to not accept jdbcUrl, jdbc:h2:mem:integrationTestDB;DB_CLOSE_DELAY=-1;MODE=MSSQLServer;INIT=CREATE SCHEMA IF NOT EXISTS dbo\;SET SCHEMA dbo
Caused by: java.lang.RuntimeException: Driver com.microsoft.sqlserver.jdbc.SQLServerDriver claims to not accept jdbcUrl, jdbc:h2:mem:integrationTestDB;DB_CLOSE_DELAY=-1;MODE=MSSQLServer;INIT=CREATE SCHEMA IF NOT EXISTS dbo\;SET SCHEMA dbo
这是我的集成-test.properties,用于测试:
spring.datasource.url=jdbc:h2:mem:integrationTestDB;\
DB_CLOSE_DELAY=-1;\
MODE=MSSQLServer;\
INIT=CREATE SCHEMA IF NOT EXISTS dbo\;SET SCHEMA dbo
spring.datasource.driver=org.h2.Driver
spring.datasource.hikari.driver-class-name=org.h2.Driver
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.hbm2ddl.auto=none
spring.datasource.username=sa
spring.datasource.password=
spring.liquibase.user=sa
spring.liquibase.password=
H2的版本是1.4.200。
成功与失败的区别在于pom的父元素中的SpringBoot版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
liquibase 版本从 3.8.9 更改为 3.10.3。我将其配置为保持在 3.8.9,但这没有帮助。
我阅读了发行说明,找到了有关嵌入式数据库检测的部分:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes#embedded-database-detection
但添加
spring.datasource.initialization-mode=always
对属性也没有帮助。
我记得上次找对数据源url花了一些时间,但是google找不到新的线索了。
请问是什么原因导致的?
亲切的问候,
乌尔里希
您的属性混合了 H2 和 SQL 服务器配置。例如,您为 DataSource 配置了 H2 JDBC URL,但配置 Hibernate 使用 SQLServerDialect
。异常显示尝试初始化 Liquibase 时正在使用 SQL 服务器的 JDBC 驱动程序。在我看来,您正试图在集成测试中使用 H2,替换部署应用程序时使用的 SQL 服务器。
有一个new spring.liquibase.driver-class-name
property in 2.4.0。如果未设置,它会回退到使用 spring.datasource.driver-class-name
。没有 spring.datasource.driver
属性 所以尝试替换以下两行:
spring.datasource.driver=org.h2.Driver
spring.datasource.hikari.driver-class-name=org.h2.Driver
使用以下行:
spring.datasource.driver-class-name=org.h2.Driver
我有一个 SpringBoot 应用程序,它使用 H2 内存数据库进行集成测试。如果我在 versino 2.3.4.RELEASE 中使用 SpringBoot,则测试有效。如果我升级到 2.4.0 并出现以下错误,它们将失败:
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Driver com.microsoft.sqlserver.jdbc.SQLServerDriver claims to not accept jdbcUrl, jdbc:h2:mem:integrationTestDB;DB_CLOSE_DELAY=-1;MODE=MSSQLServer;INIT=CREATE SCHEMA IF NOT EXISTS dbo\;SET SCHEMA dbo
Caused by: java.lang.RuntimeException: Driver com.microsoft.sqlserver.jdbc.SQLServerDriver claims to not accept jdbcUrl, jdbc:h2:mem:integrationTestDB;DB_CLOSE_DELAY=-1;MODE=MSSQLServer;INIT=CREATE SCHEMA IF NOT EXISTS dbo\;SET SCHEMA dbo
这是我的集成-test.properties,用于测试:
spring.datasource.url=jdbc:h2:mem:integrationTestDB;\
DB_CLOSE_DELAY=-1;\
MODE=MSSQLServer;\
INIT=CREATE SCHEMA IF NOT EXISTS dbo\;SET SCHEMA dbo
spring.datasource.driver=org.h2.Driver
spring.datasource.hikari.driver-class-name=org.h2.Driver
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.hbm2ddl.auto=none
spring.datasource.username=sa
spring.datasource.password=
spring.liquibase.user=sa
spring.liquibase.password=
H2的版本是1.4.200。 成功与失败的区别在于pom的父元素中的SpringBoot版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
liquibase 版本从 3.8.9 更改为 3.10.3。我将其配置为保持在 3.8.9,但这没有帮助。
我阅读了发行说明,找到了有关嵌入式数据库检测的部分:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes#embedded-database-detection
但添加
spring.datasource.initialization-mode=always
对属性也没有帮助。
我记得上次找对数据源url花了一些时间,但是google找不到新的线索了。
请问是什么原因导致的?
亲切的问候, 乌尔里希
您的属性混合了 H2 和 SQL 服务器配置。例如,您为 DataSource 配置了 H2 JDBC URL,但配置 Hibernate 使用 SQLServerDialect
。异常显示尝试初始化 Liquibase 时正在使用 SQL 服务器的 JDBC 驱动程序。在我看来,您正试图在集成测试中使用 H2,替换部署应用程序时使用的 SQL 服务器。
有一个new spring.liquibase.driver-class-name
property in 2.4.0。如果未设置,它会回退到使用 spring.datasource.driver-class-name
。没有 spring.datasource.driver
属性 所以尝试替换以下两行:
spring.datasource.driver=org.h2.Driver
spring.datasource.hikari.driver-class-name=org.h2.Driver
使用以下行:
spring.datasource.driver-class-name=org.h2.Driver