You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

H2数据库控制台:如何连接嵌入式H2 JPA数据库?

解决H2控制台无法连接JPA单元测试内存数据库的问题

你遇到的核心问题是H2内存数据库的进程隔离特性——你配置的jdbc:h2:mem:test是进程私有内存库,单元测试运行在一个独立JVM进程里,而H2控制台是另一个单独的JVM进程,默认情况下这两个进程无法共享同一个内存数据库。下面是几种可行的解决方案,按推荐程度排序:

方案1:改用TCP模式的内存数据库(跨进程访问最可靠)

这种方式让H2以TCP服务器形式运行,允许不同进程共享同一个内存数据库:

  1. 修改persistence.xml的JDBC URL
    将原URL替换为:
    <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/mem:test;DB_CLOSE_DELAY=-1"/>
    
    • tcp://localhost:指定通过TCP协议连接H2服务器
    • DB_CLOSE_DELAY=-1:防止最后一个连接关闭时销毁内存数据库
  2. 启动H2 TCP服务器
    • 打开H2控制台,点击页面底部的「启动服务器」按钮;
    • 或者通过命令行启动(确保classpath包含H2 1.4.200的jar包):
      java -cp h2-1.4.200.jar org.h2.tools.Server -tcpAllowOthers
      
  3. 用H2控制台连接
    在控制台的JDBC URL输入框中填写:jdbc:h2:tcp://localhost/mem:test,用户名填sa,密码留空,点击「连接」即可看到Hibernate创建的表和序列。

方案2:让测试进程保持运行,修改内存库的销毁策略

如果不想用TCP模式,可以调整内存库配置,同时让单元测试进程不立即退出:

  1. 更新persistence.xml的JDBC URL
    <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/>
    
    • DB_CLOSE_DELAY=-1:禁止H2在最后一个连接关闭时自动销毁数据库
    • DB_CLOSE_ON_EXIT=FALSE:禁止JVM退出时关闭数据库
  2. 让单元测试进程保持运行
    • 用调试模式运行单元测试,在测试方法的最后一行设置断点,测试执行完毕后进程会暂停;
    • 或者在测试方法末尾添加一行代码让进程休眠:
      Thread.sleep(Long.MAX_VALUE);
      
  3. 连接H2控制台
    输入和persistence.xml中相同的JDBC URL,用户名sa,密码空,就能访问测试中的数据库了。

方案3:改用文件模式的H2数据库(数据持久化,适合长期调试)

如果希望测试结束后数据依然保留,方便随时查看,可以改用文件存储的H2数据库:

  1. 修改persistence.xml的JDBC URL
    <property name="javax.persistence.jdbc.url" value="jdbc:h2:file:./target/test-h2-db;DB_CLOSE_DELAY=-1"/>
    
    数据库文件会保存在项目的target/test-h2-db路径下
  2. 运行单元测试
    Hibernate会自动在文件数据库中创建表和序列
  3. H2控制台连接
    输入同样的JDBC URL,用户名sa,密码空,就能随时查看数据库内容,哪怕测试进程已经结束。

额外检查点

  • 确保H2控制台的版本和你项目中依赖的H2版本完全一致(都是1.4.200),版本不匹配可能导致连接失败;
  • 确认测试日志中确实输出了创建表、序列的SQL语句,说明Hibernate已经成功执行了DDL操作;
  • 连接H2控制台时,默认用户名是sa,密码为空,不要输入错误的凭据。

内容的提问来源于stack exchange,提问作者user6882156

火山引擎 最新活动