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

Communication failure detected when attempting to perform read query outside of a transaction. Attempting to retry query

我是 运行 带有码头 9.4.7.v20170914 并使用 Apache Derby 10.14.1.0 连接到数据库的 Web 服务器。我的大部分交易工作正常,但是当数据库负载过重时,查询开始失败,挂起数据库直到它们成功完成。我是 运行 一个抓取网站并在数据库中批量插入数千个对象的脚本,这个问题导致它需要很长时间才能完成。

单元测试适用于每个数据库操作,我检查了 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

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