【问题标题】:Communication failure detected when attempting to perform read query outside of a transaction. Attempting to retry query尝试在事务之外执行读取查询时检测到通信故障。尝试重试查询
【发布时间】:2018-06-13 15:16:44
【问题描述】:

我正在使用 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

【问题讨论】:

  • 请发布完整的异常堆栈跟踪。该错误似乎表明您分配了太多套接字,这可能意味着您没有正确关闭连接,或者应该使用连接池库。
  • @MarkRotteveel 这是我针对该特定异常获得的唯一输出。我有时会遇到其他错误,但只有在重负载时才会出现。我已将它们添加到帖子中。
  • 您使用的是什么操作系统?在 Linux/Mac 上使用 'lsof' 或 'netstat' 之类的工具,或者在 Windows 上使用 ProcessExplorer 之类的工具,看看您是否可以调查 @MarkRotteveel 的想法。
  • @BryanPendleton 我试过用 ProcessExplorer 检查这个,但我真的不知道我在找什么。 Derby 进程有一个始终在侦听的 TCP 连接,而我拥有的最多连接是另外两个,处于已建立状态。
  • 请内联发布异常,不要使用 pastebin。

标签: jdbc tcp eclipselink derby entitymanager


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多