尝试在事务外执行读取查询时检测到通信故障。试图重试查询

时间:2018-06-13 15:16:45

标签: jdbc tcp eclipselink derby entitymanager

我正在运行一个带有jetty 9.4.7.v20170914的Web服务器,并使用Apache Derby 10.14.1.0连接到数据库。我的大多数事务都运行正常,但是当数据库处于高负载期间时,查询开始失败,挂起数据库直到它们成功完成。我正在运行一个脚本来抓取网站并批量插入数据库中的数千个对象,这个问题导致它需要花费大量时间才能完成。

单元测试适用于每个数据库操作,我检查了我的EntityManager用法,以确保我正确地打开,提交和关闭事务。我已经尝试过其他版本的Eclipselink,Jetty和Derby,但它没有解决问题。

问题出现在不同的查询中,但我相信它总是发生在SELECT语句中。请注意,我在创建对象之前检查对象是否存在,但它们是两个单独的事务。

[EL Info]: query: 2018-06-13 16:03:48.344--UnitOfWork(1800307564)--Communication failure detected when attempting to perform read query outside of a transaction. Attempting to retry query. Error was: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.5.v20170607-b3d05bd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLNonTransientConnectionException: java.net.BindException : Error connecting to server localhost on port 1,527 with message Address already in use: connect.
Error Code: 40000
Call: SELECT t1.ID, t1.PARENTADDITIVECLASSID FROM ADDITIVE t0, ADDITIVE_ADDITIVECLASS t2, ADDITIVECLASS t1 WHERE ((t0.ID = ?) AND ((t2.additiveClasses_ID = t1.ID) AND (t0.ID = t2.additives_ID)))
        bind => [1 parameter bound]
Query: ReadAllQuery(name="entity.Additive.GET_ADDITIVECLASSES" referenceClass=AdditiveClass sql="SELECT t1.ID, t1.PARENTADDITIVECLASSID FROM ADDITIVE t0, ADDITIVE_ADDITIVECLASS t2, ADDITIVECLASS t1 WHERE ((t0.ID = ?) AND ((t2.additiveClasses_ID = t1.ID) AND (t0.ID = t2.additives_ID)))").

我也得到以下例外,尽管不是那么频繁。

https://pastebin.com/DWzdhejz

https://pastebin.com/0NZ8keF9

1 个答案:

答案 0 :(得分:0)

将数据库迁移到本地Ubuntu 18.04安装后,问题消失了(在VMware Workstation 14上运行相同的映像无法解决问题)。正如@Chris在评论中指出的那样,这可能是Windows如何分配出站TCP端口的问题。我可以为此使用Linux,但是如果有人在Windows上遇到这些问题,请务必检查this guide。请注意,我自己尚未测试这些步骤。