【问题标题】:Spring Boot default H2 jdbc connection (and H2 console)Spring Boot 默认 H2 jdbc 连接(和 H2 控制台)
【发布时间】:2014-08-30 14:19:56
【问题描述】:

我只是想查看当我在application.properties 中未指定任何内容并从 mvn spring:run 开始时 spring-boot 创建的嵌入式 H2 数据库的 H2 数据库内容。我可以看到 hibernate JPA 创建了表,但是如果我尝试通过下面的 URL 访问 h2 控制台,则数据库没有表。

http://localhost:8080/console/

我看到这样的建议: View content of embedded H2 database started by Spring

但我不知道在 spring-boot 中将建议的 XML 放在哪里,即使我这样做了,我也不希望 h2console 在配置外部数据库时不再可用,因此更有可能我需要使用某种条件代码来处理这个问题(或者在最理想的情况下,我只在激活 maven 配置文件时才包含 H2,也许只是让 spring 自动处理它)。

有没有人有一些示例代码显示如何让 H2 控制台在启动时工作(以及找出 spring 使用的 jdbc 连接字符串是什么的方法)?

【问题讨论】:

    标签: java spring spring-boot h2 spring-jdbc


    【解决方案1】:

    这就是我如何让 H2 控制台在带有 H2 的 spring-boot 中工作。我不确定这是否正确,但由于没有其他人提供解决方案,所以我建议这是最好的方法。

    在我的例子中,我为数据库选择了一个特定的名称,以便在启动 H2 控制台时可以输入一些内容(在本例中为“AZ”)。我认为所有这些都是必需的,尽管省略 spring.jpa.database-platform 似乎并没有什么坏处。

    在 application.properties 中:

    spring.datasource.url=jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.username=sa
    spring.datasource.password=
    spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
    

    在 Application.java(或一些配置)中:

    @Bean
    public ServletRegistrationBean h2servletRegistration() {
        ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet());
        registration.addUrlMappings("/console/*");
        return registration;
    }
    

    然后您可以在 {server}/console/ 访问 H2 控制台。输入这个作为 JDBC URL:jdbc:h2:mem:AZ

    【讨论】:

    • 使用new WebServlet() 给我问题。这是为您导入的哪个类?它为我拉入 javax.servlet.annotation.WebServlet 作为唯一的选择,它只是一个接口。
    • 哦,我明白了,org.h2.server.web.WebServlet 是我们需要的。我的项目与 Gradle 不同步,无法引入新的 h2 库。
    • 不需要 application.properties 部分。您可以只使用您放置的 Application.java 部分,然后使用空白用户名和空白密码连接到 jdbc:h2:mem:testdblocalhost:8082 适用于此设置。
    • @Splaktar 谢谢!我正在疯狂地试图弄清楚如何连接,而缺少的部分是使用“testdb”作为数据库名称。
    • @Splaktar - 你应该让你的评论成为答案。就像你说的,EmbeddedDatabaseConnection 的源代码显示了所有默认的嵌入式数据库连接 URI
    【解决方案2】:

    我找到了一个关于这个主题的很好的教程:

    https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/

    对我来说正确的 JDBC URL 基本上是:jdbc:h2:mem:testdb

    【讨论】:

    • 愚蠢的问题,但这似乎是默认的 JDBC URL,因为设置 spring.datasource.name 默认为 testdb。为什么如果我将数据库名称更改为类似 foodb 的情况是 jdbc 仍然相同而不是 jdbc:h2:mem:foodb
    • 这个 jdbc url jdbc:h2:mem:testdb 是正确的。它帮助我最终连接到 spring data jpa 创建的默认数据库。
    • 您可以将数据库名称设置为任何内容,例如:spring.datasource.url=jdbc:h2:mem:test;在 application.properties 中
    【解决方案3】:

    从 Spring Boot 1.3.0.M3 开始,H2 控制台可以自动配置。

    先决条件是:

    • 您正在开发网络应用程序
    • Spring Boot 开发工具已启用
    • H2 在类路径中

    即使你不使用 Spring Boot Dev Tools,你仍然可以通过将 spring.h2.console.enabled 设置为 true 来自动配置控制台

    查看this 部分文档以了解所有详细信息。

    请注意,以这种方式配置时,可以通过以下方式访问控制台:http://localhost:8080/h2-console/

    【讨论】:

    • 或者如文档中所述,您使用 spring.h2.console.enabled=true 启用它。根据先决条件,它会自动启用。
    • 你正在开发一个网络应用究竟是什么意思?
    • 在Spring Boot的上下文中,表示你添加了spring-boot-starter-web作为依赖
    • 我还认为,当您打开 localhost:8080/h2-console 时,您需要在 jdbc url 中写入 jdbc:h2:mem:testdb 才能查看您的表格。在 localhost 之后的 url localhost:8080/h2-console 中,您需要指定应用程序的端口。
    • @anujprashar 我很确定jdbc:h2:mem:testdb 用于连接 URL,而不是用于控制台可访问的 URL
    【解决方案4】:

    来自http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

    H2 Web 控制台(H2ConsoleProperties):

    spring.h2.console.enabled=true //Enable the console.
    spring.h2.console.path=/h2-console //Path at which the console will be available.
    

    将以上两行添加到我的 application.properties 文件中就足以访问 H2 数据库 Web 控制台,使用默认用户名 (sa) 和密码(为空,如在 ui 提示时不要输入密码) .

    【讨论】:

    • 不应该是spring.h2.console.enabled=true? False 将禁用它。 spring.h2.console.path=/h2-console 是多余的,因为 /h2-console 是 Spring Boot 的默认路径。根据文档“默认情况下,控制台将在 /h2-console 中可用。您可以使用 spring.h2.console.path 属性自定义控制台的路径。”更多细节在这里docs.spring.io/spring-boot/docs/current/reference/html/…
    • 我包含了后一个属性以向 OP 显示他可以访问控制台的位置。显然 spring.h2.console.enabled.enabled=false 将禁用控制台,关键是这可以配置为属性。为了清楚起见,我将该属性设置为 true。
    【解决方案5】:

    我在 /resources/application.properties 中只有以下属性。运行spring boot后,使用这个URL(http://localhost:8080/h2-console/),H2控制台中的表是可见的,可以读取查看表数据,也可以运行简单的SQL命令。一件事,在您的 java 代码中,在获取数据时,列名是大写的,即使 schema.sql 使用的是小写名称:)

    spring.datasource.initialize=true
    spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE
    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.username=sa
    spring.datasource.password=
    spring.h2.console.enabled=true
    

    【讨论】:

      【解决方案6】:

      一步一步指南的类似答案。

      1. 开发者工具依赖添加到您的pom.xmlbuild.gradle

      Maven

      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-devtools</artifactId>
              <optional>true</optional>
          </dependency>
      </dependencies>
      

      Gradle

      dependencies {
          compile("org.springframework.boot:spring-boot-devtools")
      }
      
      1. http://localhost:8080/h2-console/访问数据库
      2. jdbc:h2:mem:testdb 指定为 JDBC URL
      3. 您应该在项目中以表格形式看到您指定的实体。

      【讨论】:

      • 在依赖部分添加这个对我有用'runtime("com.h2database:h2")'
      【解决方案7】:

      为了获取表,您只需创建 2 个 sql 文件 schema.sql(用于创建表)和 data.sql(用于创建的表的数据)。这些文件要放在 src/main/resources 文件夹中。 Spring boot auto 会检测到它们并在运行时处理其余部分。

      如果您在项目中使用超过 2 个数据库,请确保使用特定文件,例如(schema-h2.sql -- 用于 h2 DB,schema-oracle.sql -- 用于 oracle DB)。 data.sql 也一样。

      还要确保通过在 schema.sql 中添加 drop table 语句作为第一条语句来删除表。避免追加重复记录。

      spring boot 的链接在这里。

      我的application.properties如下。

      spring.datasource.url=jdbc:h2:~/file/Shiva;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
      spring.datasource.driver-class-name=org.h2.Driver
      spring.datasource.username=sa
      spring.datasource.password=
      spring.datasource.platform=h2
      spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
      spring.h2.console.enabled=true
      spring.datasource.initialize=true 
      spring.error.whitelabel.enabled=true
      spring.h2.console.path=/console
      spring.datasource.continue-on-error=true
      spring.jpa.hibernate.ddl-auto=create
      spring.hibernate.hbm2ddl.auto=update
      spring.hibernate.show_sql=true
      

      您可以按照以下链接中的步骤操作。

      https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/

      【讨论】:

      • "spring.jpa.hibernate.ddl-auto" 两次具有不同的值...
      【解决方案8】:

      如果你使用 Spring Boot 的开发者工具,它会默认启用 H2 Console。可以从/h2-console/ 访问它。在登录界面,输入JDBC URL使用值jdbc:h2:mem:testdb。注意mem字符串。

      如果你不使用 Spring Boot 的开发者工具,你可以使用 spring.h2.console.enabled=trueapplication.properties 中启用控制台。这将在/h2-console 下启用控制台。如果您想更改 URL,则可以使用 spring.h2.console.path=my_console_path 添加另一个条目。

      默认架构名称是testdb

      更多详情请见Spring Boot Documentation

      【讨论】:

      • 为什么jdbc:h2:mem:testdb 没有设置为默认的jdbc url?我花了很多时间思考我的 jpa 实体哪里出了问题
      【解决方案9】:

      我发现使用 spring boot 2.0.2.RELEASE,在 POM 文件中配置 spring-boot-starter-data-jpa 和 com.h2database 并不足以让 H2 控制台工作。您必须按如下方式配置 spring-boot-devtools。 或者,您可以按照这篇文章中 Aaron Zeckoski 的说明进行操作

        <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-devtools</artifactId>
              <optional>true</optional>
       </dependency>
      

      【讨论】:

        【解决方案10】:

        使用 jdbc:h2:mem:testdb 作为登录 H2 控制台时的路径。

        显然,如果您更改了 Spring Boot 属性,您的数据源可能会有所不同,但您似乎正在为如何找到默认值而苦苦挣扎。这里的所有都是它的!登录 H2 后,您将看到您的架构。

        【讨论】:

          【解决方案11】:

          检查spring application.properties

          spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

          这里 testdb 是数据库定义的 确保 h2 控制台在连接时具有相同的值,否则它将连接到默认数据库

          【讨论】:

          • 完美答案!
          • 谢谢。你拯救了我的一天。我错过了更改JDBC URL 并认为“为什么更改密码不起作用???”
          【解决方案12】:

          对于 Spring Boot 2.1.1 直接来自 Spring Initialzr:

          1. devtools 的默认值为 http://127.0.0.1:8080/h2-console/

            • POM:spring-boot-starter、h2、spring-boot-starter-web、spring-boot-devtools
          2. 没有 devtools - 你需要在属性中设置它:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

            • POM:spring-boot-starter、h2、spring-boot-starter-web

          一旦你到达那里 - 设置 JDBC URL:jdbc:h2:mem:testdb(默认设置不起作用)

          【讨论】:

            【解决方案13】:

            当我遇到同样的问题时,我犯了一个非常愚蠢的错误。我为运行单元测试用例添加了 H2 DB,因此我在pom.xml 中将scope 设置为test。在使用mvn spring:run 运行应用程序时,我删除了scope,现在它可以正常工作了。

            【讨论】:

              【解决方案14】:

              对于 Spring Boot 2.3.3.RELEASE 直接来自 Spring Initialzr:

              POM:数据 jpa、h2、网络

              应用属性:spring.h2.console.enabled=true

              当您运行应用程序时,在运行控制台中查找如下行:

              2020-08-18 21:12:32.664  INFO 63256 --- [           main] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:eaa9d6da-aa2e-4ad3-9e5b-2b60eb2fcbc5'
              

              现在将上述 JDBC URL 用于 h2-console 并单击 Connect

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-10-08
                • 2023-02-08
                • 2016-05-05
                • 2019-07-27
                • 1970-01-01
                • 1970-01-01
                • 2020-12-22
                相关资源
                最近更新 更多