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