H2 服务器在调试时挂起

H2 server suspends while debugging

我有一个 Spring 应用程序在内存 H2 数据库中启动以下内容以进行 JUnit 测试:

db.jdbc.driver=org.h2.Driver
db.jdbc.url=jdbc:h2:mem:sampledb
db.jdbc.username=
db.jdbc.password=
hibernate.dialect=org.hibernate.dialect.H2Dialect

我想在我的 JUnit 测试为 运行 时轻松调试,同时浏览数据库状态,所以在测试套件之前我启动 H2 服务器:

org.h2.tools.Server.createTcpServer("-tcpPort", "9092", "-tcpAllowOthers").start();

不幸的是,当我放置任何暂停所有线程的断点时,它也会暂停 H2 服务器线程,所以我无法连接。我无法在不同的进程中启动 H2 服务器,因为内存数据库无法从外部 VM 访问。

我知道我可以使用其他类型的断点(仅挂起当前线程)但这是一种限制。您是否找到其他解决此类问题的方法?

启动 tcp 服务器在这里没有帮助,因为您正在创建内存数据库。

我建议在 线程 中启动一个控制台,并在同一段代码中(例如使用 jdbc)打开一个到这个数据库的连接但是不要close/release它。

使用此代码段执行此操作:请添加选项,例如根据 H2 文档允许其他选项(我建议暂时保留此选项)

org.h2.tools.Server.createWebServer().start();

使用 jdbc/jooq 在第二个线程中打开数据库将如下所示(这是在 Nashorn java 脚本中,但可以很容易地适应 java):

var conn = (new org.h2.Driver()).connect('jdbc:h2:mem:sampledb',new java.util.Properties());
var DB = org.jooq.impl.DSL.using(conn, org.jooq.SQLDialect.H2);

这样,基于内存的数据库就不会意外关闭,您就可以远程访问它了。将它放在线程中有望保护您免受断点影响。

更新:根据与本题原作者的讨论,最好的解决方案是在单独的进程中打开基于内存的H2,并在其上提供一个tcp服务器。这解决了问题,但在一个单独的过程中。

以下是启动单独进程的方法:

java -jar h2-1.4.188.jar -tcp -tcpPort 9092 -baseDir mem:mydb

这是要使用的 JDBC url:jdbc:h2:tcp://localhost:9092/mem:mydb

重要提示:如果此基于内存的数据库上的所有连接都关闭,则内容将消失。所以这种方法要慎用。如果您需要通过测试持久化,请使用基于标准文件的 H2 DB。

有点老问题了,但对于那些偶然发现这个话题并正在寻找简单答案的人来说:

基本上,您可以将调试器断点设置为挂起所有线程(在这种情况下 H2 服务器也将挂起)或仅挂起当前线程 - 这是您正在寻找的设置,H2 服务器将继续 运行.

例如如果您使用的是 IntelliJ,则右键单击断点(或 Ctrl + Shift + F8 打开 "Breakpoints" 对话框 window)并设置 "Suspend Thread"

作为帕维尔 Os。提到仅暂停一个线程并结合使用 AUTO_SERVER 选项可以正常工作!我的 Spring 引导配置如下所示:

spring.datasource.url=jdbc:h2:~/test:testdb;AUTO_SERVER=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password

intelliJ 数据库配置如下: