h2 localhost url different from testdb

♀尐吖头ヾ 提交于 2021-02-08 09:52:51

问题


I am using below spring boot config:

<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>

When my spring app comes up, I see the following:

H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:304a69fe-27f6-4271-a5c3-015f06910885'

However if i set the below in property file, i do see testdb being connected:

spring.datasource.url=jdbc:h2:mem:testdb

Can someone please let me know why do i need to explicitly set the url in property file? I had created another spring boot app recently with the exact same config but with spring boot version 2.2.4.RELEASE where h2 connected by default to testdb without setting it in property file.

Thanks!


回答1:


Found out that with the latest versions of Spring Boot (2.3+), the H2 database name is randomly generated each time you restart the server. Similar post: springboot 2.3.0 while connecting to h2 database




回答2:


  • Reconsider default for spring.datasource.generate-unique-name as the current one makes test cases brittle #16747
    • commit

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.

You can revert to the previous behavior by following setting:

spring.datasource.generate-unique-name=false



回答3:


Update:

As you are using h2 console, you probably have a property called

spring.h2.console.enabled=true

If so then Spring's H2ConsoleAutoConfiguration class gets enabled and it does the auto-configuration as given below. (Check here )


If you are using any of this annotations - @DataJdbcTest, @DataJpaTest and @JdbcTest in your test, then Spring through @AutoConfigureTestDatabase will call TestDatabaseAutoConfiguration, which in turn, by default, will configure an in-memory embedded database instance with an auto generated unique name.

If you want to solve the problem for single test case, please use:

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

If you want this to apply for all test cases, then please have this property in application.yaml

spring:
  test:
    database:
      replace: none


来源:https://stackoverflow.com/questions/62748262/h2-localhost-url-different-from-testdb

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!