ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-28 01:02:14  阅读:176  来源: 互联网

标签:multithreading junit h2 spring java


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

标签:multithreading,junit,h2,spring,java
来源: https://codeday.me/bug/20191028/1948745.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有