H2 控制台看不到 JAVA 创建的表

Posted

技术标签:

【中文标题】H2 控制台看不到 JAVA 创建的表【英文标题】:H2 Console Cant see tables created by JAVA 【发布时间】:2014-07-29 19:08:34 【问题描述】:

我已经从http://www.h2database.com/html/download.html下载了H2控制台 我已经在我的jdbc.properties 文件中配置了 URL 到jdbc:h2:c:/data/Messaging

我在文件中使用相同的 URL 连接到数据库,但我看不到表; 我只能看到信息架构,当我尝试在其中 select * from tables 时,我也看不到表格。

有人知道哪里出了问题吗?

【问题讨论】:

请查看:***.com/a/24012222/2439249 【参考方案1】:

一个棘手的问题是,如果您尝试连接到不存在的 JDBC URL,H2 控制台不会给您错误。相反,它将在该 URL 处创建一个新数据库!要连接到内存数据库,请使用此 JDBC URL(http://localhost:8080/h2-console 是默认控制台):

jdbc:h2:mem:testdb

如果您要输入 jdbc:h2:~/test 之类的内容,则会在您的主目录下创建一个 test.mv 文件。但您的应用程序仍将使用内存数据库。

如果您的 pom 中有 h2 依赖项以及 spring 开发人员工具依赖项,则控制台可用。如果您没有工具依赖项,那么您也可以通过拥有 h2 依赖项并将以下内容添加到您的 application.properties 文件中来查看它:

spring.h2.console.enabled=true  #not needed if you have spring-boot-devtools dependency

如果您希望 db 作为文件而不是在内存中,请将以下内容添加到 applications.properties:

spring.datasource.url=jdbc:h2:~/test_db  #You will see the file in your home directory.

H2 不适用于持久化数据,但如果您想持久化用于测试目的,请添加:

spring.jpa.hibernate.ddl-auto = update

然后启动应用程序,并在控制台中使用此 JDBC URL:

jdbc:h2:~/test_db

如果您想知道,我在 application.properties 中只有 1 个条目(用于数据库文件),这是我的依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

【讨论】:

这是一个了不起的答案,非常清晰且写得很好。它帮助我澄清了技术,以至于我能够找到我自己遇到的这个问题的答案。我只是在这里放一个注释,因为给出的一些信息似乎已经过时了:字符串jdbc:h2:mem:testdb 将不再工作,而是一个相当长的随机字符串似乎是必要的。不久前,我使用下面的更新信息添加了一个新答案。【参考方案2】:

根据您的问题,您似乎并没有成为这个特殊陷阱的受害者,但是这个线程最终帮助我确定了这个问题,所以我在这里记录解决方案以供后人使用,因为它可以帮助其他人解决同样的问题。

我还发现,当我尝试使用 H2 控制台打开我的数据库时,我得到的似乎是一个空白的 H2 数据库(基本上,只是一个 INFORMATION_SCHEMA 表)。在仔细检查数据库名称是否正确 (mydb.mv.db) 时,我发现 H2 控制台创建了第二个数据库文件 mydb.mv.db.mv.db。奇怪。

事实证明,H2 控制台希望您从文件名中省略后缀 .mv.db。因为我没有,所以它正在寻找mydb.mv.db.mv.db。将 JDBC 字符串更改为 jdbc:h2:mydb 解决了问题,然后我可以从 H2 控制台打开文件。

【讨论】:

亲爱的,你必须省略后缀吗?在为这个问题苦恼了四天之后,这终于为我解决了。谢谢! 这个答案帮助我弄清楚我必须将 H2 控制台中的默认建议 JDBC URL 从“jdbc:h2:~/test”更改为“jdbc:h2:mem:test”查看我的内存数据库“test”中的表。 我提供了该文件的完整路径 /home/saravana/demo/config/test.mv.db => /home/saravana/demo/config/test 现在可以看到我的数据库中的所有表.【参考方案3】:

这是使用 h2 模块启用内存启用数据库的方法。 您需要确保以下几点

    您的类具有@Entity 注释。 您需要在application.properties文件spring.h2.console.enabled=true中启用以下内容 运行 Spring Boot 并输入以下 URL localhost:8080/h2-console 这将显示一个连接屏幕。在JDBC URL: -> jdbc:h2:mem:testdb 中输入以下更改 点击连接按钮。

【讨论】:

【参考方案4】:

遇到同样的问题。

这为我解决了这个问题: Why is my embedded h2 program writing to a .mv.db file

刚刚将;MV_STORE=FALSE;MVCC=FALSE 添加到jdbc url,一切正常。

【讨论】:

Fantastic 终于添加了这些,所以我可以在 fbvizualizer jdbc:h2:~/nexin;DB_CLOSE_DELAY=-1;MODE=mysql;MV_STORE=FALSE;MVCC=FALSE 中查看文件数据库【参考方案5】:

我使用了下面的,我看到我的表被创建了。


spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
spring.h2.console.enabled=true
spring.h2.console.path=/h2console
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

【讨论】:

【参考方案6】:

您也可以通过在 H2 控制台和您的 Java 代码之间使用相同的版本来避免这个问题。

这就是我解决同样问题的方法here。

【讨论】:

【参考方案7】:

在主类中添加注解@EntityScan("packageName")

【讨论】:

【参考方案8】:

我终于弄清楚了如何查看我的默认内存 H2 数据库表。我分享这个解决方案是因为我认为由于安全问题,这个过程最近必须改变。不再可能使用默认的 jdbc:h2:mem:testdb 来访问数据库,也无法通过 application.propertiesspring.datasource 设置条目名称。 name=yourdbnamehere.

在撰写本文时,当应用程序启动时,会出现类似于以下内容的控制台消息:

2021-04-26 21:16:44.424  INFO 23142 --- [  restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:6da7bb82-4008-4396-b825-09e44c17388b'

我正在使用 Spring Tool Suite 4。其他 IDE 可能会以不同的方式格式化此消息。

关键部分是该字符串的最后一部分,其中指定了数据库地址。数据库的标识符现在随着每次引导而改变。 (也许有办法抑制这个,但我不知道。)

我复制了地址 jdbc:h2:mem:whatever-long-random-name,并将其粘贴到标有“JDBC URL”的 h2-console 登录表单字段中。进入后,点击或单击 Connect 将显示数据库架构和控制台。

我正在学习的教程是 Dan Vega 的“Springit”应用程序,来自他的 Getting Started With Spring Boot 2.0 课程。我将此信息包括为任何关注的人的搜索面包屑。这门课程现在可能已经有几年的历史了,但 Vega 的解释工作比平均水平要好得多,所以它仍然值得。然而,随着技术的进步,我认为对增强安全性的需求已经增长到允许一个容易猜到的数据库名称不再安全的地步。

【讨论】:

以上是关于H2 控制台看不到 JAVA 创建的表的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot/H2 控制台未显示我的表

H2 控制台无法访问 jbdc 数据库

H2DB 文件中的表不会出现在 IDEA 中,但会显示在 H2 控制台中

java中 总是提示找不到mysql数据库的表

如何在 H2 控制台中安装 MYSQL 驱动程序

无法使用 H2 控制台查看现有 H2 数据库