我有一个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访问内存数据库。
我知道我可以使用其他类型的断点(仅挂起当前线程)但它是一种限制。您是否找到了解决此类问题的其他解决方案?
答案 0 :(得分:2)
启动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。
答案 1 :(得分:2)
有点老问题,但对于那些碰巧偶然发现这个帖子而且正在寻找一个简单答案的人:
基本上,您可以将调试器断点设置为挂起所有线程(在这种情况下H2服务器也将暂停)或仅挂起当前线程 - 这是您正在寻找的设置,H2服务器将继续运行。 / p>
E.g。如果您使用的是IntelliJ,则右键单击断点(或按Ctrl + Shift + F8打开“断点”对话框窗口)并设置“挂起线程”
答案 2 :(得分:0)