java-H2服务器在调试时挂起

我有一个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 Server:

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

不幸的是,当我放置任何挂起所有线程的断点时,它也会同时挂起H2服务器线程,因此无法连接.我无法以不同的方式启动H2服务器,因为无法从外部VM访问内存数据库.

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

解决方法:

由于正在创建内存数据库,因此启动tcp服务器将无济于事.

我建议改为在线程中启动控制台,并在同一段代码(例如,使用jdbc)中打开与此数据库的连接,但不要关闭/释放它.

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

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

使用jdbc / jooq在第二个线程中打开数据库将如下所示(这是在Nashorn javascript中,但可以轻松地适应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网址:jdbc:h2:tcp:// localhost:9092 / mem:mydb

重要说明:如果该基于内存的数据库上的所有连接均已关闭,则内容将消失.因此,应谨慎使用此方法.如果您需要在测试中保持持久性,请使用基于文件的标准H2 DB.

上一篇:java-在sql2o中插入时出错


下一篇:java-如何使用不带XML的Spring启动H2 WebServer?