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