h2 localhost url 与 testdb 不同
h2 localhost url different from testdb
我正在使用以下 spring 引导配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
当我的 spring 应用出现时,我看到以下内容:
H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:304a69fe-27f6-4271-a5c3-015f06910885'
但是,如果我在 属性 文件中设置以下内容,我会看到正在连接 testdb:
spring.datasource.url=jdbc:h2:mem:testdb
有人可以告诉我为什么我需要在 属性 文件中明确设置 url 吗?我最近使用完全相同的配置创建了另一个 spring 启动应用程序,但使用 spring 启动版本 2.2.4.RELEASE 其中 h2 默认连接到 testdb 而无需在 属性 文件.
谢谢!
更新:
当您使用 h2 控制台时,您可能有一个 属性 名为
spring.h2.console.enabled=true
如果是这样,那么 Spring 的 H2ConsoleAutoConfiguration class 将被启用,它会执行如下所示的自动配置。 (检查 here )
如果您正在使用任何此注释 - @DataJdbcTest、@DataJpaTest 和 @JdbcTest,然后 Spring 通过 @AutoConfigureTestDatabase 将调用 TestDatabaseAutoConfiguration
,默认情况下,它将配置内存中的嵌入式数据库实例自动生成的唯一名称。
如果你想解决单个测试用例的问题,请使用:
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
如果您希望它适用于所有测试用例,请将此 属性 放入 application.yaml
spring:
test:
database:
replace: none
This change ensures that each test in a test suite that shares an
application context gets a unique embedded database, to prevent
inconsistent embedded database state between tests.
您可以通过以下设置恢复到之前的行为:
spring.datasource.generate-unique-name=false
发现使用最新版本的Spring Boot (2.3+),每次重启服务器时都会随机生成H2数据库名称。类似post:springboot 2.3.0 while connecting to h2 database
我正在使用以下 spring 引导配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
当我的 spring 应用出现时,我看到以下内容:
H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:304a69fe-27f6-4271-a5c3-015f06910885'
但是,如果我在 属性 文件中设置以下内容,我会看到正在连接 testdb:
spring.datasource.url=jdbc:h2:mem:testdb
有人可以告诉我为什么我需要在 属性 文件中明确设置 url 吗?我最近使用完全相同的配置创建了另一个 spring 启动应用程序,但使用 spring 启动版本 2.2.4.RELEASE 其中 h2 默认连接到 testdb 而无需在 属性 文件.
谢谢!
更新:
当您使用 h2 控制台时,您可能有一个 属性 名为
spring.h2.console.enabled=true
如果是这样,那么 Spring 的 H2ConsoleAutoConfiguration class 将被启用,它会执行如下所示的自动配置。 (检查 here )
如果您正在使用任何此注释 - @DataJdbcTest、@DataJpaTest 和 @JdbcTest,然后 Spring 通过 @AutoConfigureTestDatabase 将调用 TestDatabaseAutoConfiguration
,默认情况下,它将配置内存中的嵌入式数据库实例自动生成的唯一名称。
如果你想解决单个测试用例的问题,请使用:
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
如果您希望它适用于所有测试用例,请将此 属性 放入 application.yaml
spring:
test:
database:
replace: none
This change ensures that each test in a test suite that shares an application context gets a unique embedded database, to prevent inconsistent embedded database state between tests.
您可以通过以下设置恢复到之前的行为:
spring.datasource.generate-unique-name=false
发现使用最新版本的Spring Boot (2.3+),每次重启服务器时都会随机生成H2数据库名称。类似post:springboot 2.3.0 while connecting to h2 database