2017-08-31 96 views
1

我遇到了一个问题追逐“EclipseLink-4005(..)DatabaseAccessor未连接”错误在我们的应用程序的罪魁祸首。它是一个独立的应用程序(不是Web应用程序),具有多个线程连接到相同的数据库(Oracle)。我们使用EclipseLink 2.4.2及其默认设置的内部连接池。事务在应用程序中进行管理,并且可以嵌套。该应用程序大多数时间工作正常,但偶尔在高负载下失败,“EclipseLink-4005(..)DatabaseAccessor未连接”错误。DatabaseAccessor未在高负载情况下连接

我能够在我们的测试环境中重现错误,但无法理解可能发生的情况。一些交易长期运行。是否有可能超时,导致相应的会话注销并导致另一个线程中的错误?

下面是样本堆栈跟踪:

Exception [EclipseLink-4005] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.DatabaseException 
Exception Description: DatabaseAccessor not connected. 
    at org.eclipse.persistence.exceptions.DatabaseException.databaseAccessorNotConnected(DatabaseException.java:116) 
    at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:309) 
    at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.beginTransaction(DatasourceAccessor.java:238) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicBeginTransaction(AbstractSession.java:526) 
    at org.eclipse.persistence.sessions.server.ClientSession.addWriteConnection(ClientSession.java:693) 
    at org.eclipse.persistence.sessions.server.ServerSession.acquireClientConnection(ServerSession.java:246) 
    at org.eclipse.persistence.sessions.server.ClientSession.getAccessor(ClientSession.java:333) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.getAccessor(UnitOfWorkImpl.java:1867) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.unwrap(EntityManagerImpl.java:2540) 
    (..) 

Exception [EclipseLink-4005] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.DatabaseException 
Exception Description: DatabaseAccessor not connected. 
    at org.eclipse.persistence.exceptions.DatabaseException.databaseAccessorNotConnected(DatabaseException.java:116) 
    at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:309) 
    at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.rollbackTransaction(DatasourceAccessor.java:671) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.rollbackTransaction(DatabaseAccessor.java:1576) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicRollbackTransaction(AbstractSession.java:629) 
    at org.eclipse.persistence.sessions.server.ClientSession.basicRollbackTransaction(ClientSession.java:186) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.rollbackTransaction(AbstractSession.java:3561) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.rollbackTransaction(UnitOfWorkImpl.java:4641) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.rollbackTransaction(RepeatableWriteUnitOfWork.java:522) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.release(UnitOfWorkImpl.java:4448) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.rollback(EntityTransactionImpl.java:127) 
    (..) 

请让我知道如果你需要任何更多的信息。我很高兴分享它,因为我目前没有想法。


启用EclipseLink日志记录后的详细信息。

在日志中,我发现连接在发生错误之前不久就会断开连接(请参见下文)。我的第一个想法是,这是因为它被标记为无效(DatabaseAccessor.setIsValid),但在错误发生之前发生的唯一问题是在30分钟之前抛出OptimisticLockException,并且它由应用程序正常处理。而且,在接下来的半小时内,同样的连接会很愉快地使用,所以我不认为它被标记为无效。

TRACE [2017-09-01 10:01:04.851/-0700] [Worker-659:org.eclipse.persistence.transaction] [ ] 2017-09-01 10:01:04.851--ClientSession(436256688)--Connection(148152749)--Thread(Thread[Worker-659,5,main])-- commit transaction 
TRACE [2017-09-01 10:01:04.914/-0700] [Worker-659:org.eclipse.persistence.connection] [ ] 2017-09-01 10:01:04.914--ServerSession(441145695)--Connection(148152749)--Thread(Thread[Worker-659,5,main])-- Connection released to connection pool [default]. 
DEBUG [2017-09-01 10:01:04.914/-0700] [Worker-659:org.eclipse.persistence.connection] [ ] 2017-09-01 10:01:04.914--ServerSession(441145695)--Connection(148152749)--Thread(Thread[Worker-659,5,main])-- disconnect 
TRACE [2017-09-01 10:01:04.929/-0700] [Worker-659:org.eclipse.persistence.transaction] [ ] 2017-09-01 10:01:04.929--UnitOfWork(122187888)--Thread(Thread[Worker-659,5,main])-- end unit of work commit 
TRACE [2017-09-01 10:01:04.929/-0700] [Worker-659:org.eclipse.persistence.transaction] [ ] 2017-09-01 10:01:04.929--UnitOfWork(122187888)--Thread(Thread[Worker-659,5,main])-- resume unit of work 
TRACE [2017-09-01 10:01:04.929/-0700] [Worker-659:org.eclipse.persistence.transaction] [ ] 2017-09-01 10:01:04.929--UnitOfWork(122187888)--Thread(Thread[Worker-659,5,main])-- release unit of work 
TRACE [2017-09-01 10:01:04.929/-0700] [Worker-659:org.eclipse.persistence.connection] [ ] 2017-09-01 10:01:04.929--ClientSession(436256688)--Thread(Thread[Worker-659,5,main])-- client released 
TRACE [2017-09-01 10:01:04.929/-0700] [Worker-659:org.eclipse.persistence.query] [ ] 2017-09-01 10:01:04.929--UnitOfWork(122187888)--Thread(Thread[Worker-659,5,main])-- Execute query ReadAllQuery(...) 
TRACE [2017-09-01 10:01:04.929/-0700] [Worker-659:org.eclipse.persistence.connection] [ ] 2017-09-01 10:01:04.929--ServerSession(441145695)--Connection(985262420)--Thread(Thread[Worker-659,5,main])-- Connection acquired from connection pool [default]. 
TRACE [2017-09-01 10:01:04.961/-0700] [Worker-659:org.eclipse.persistence.connection] [ ] 2017-09-01 10:01:04.961--ServerSession(441145695)--Connection(985262420)--Thread(Thread[Worker-659,5,main])-- Connection released to connection pool [default]. 
WARN [2017-09-01 10:01:04.961/-0700] [Worker-659:org.eclipse.persistence] [ ] 2017-09-01 10:01:04.961--UnitOfWork(122187888)--Thread(Thread[Worker-659,5,main])-- 
Local Exception Stack: 
Exception [EclipseLink-4005] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.DatabaseException 
Exception Description: DatabaseAccessor not connected. 
    at org.eclipse.persistence.exceptions.DatabaseException.databaseAccessorNotConnected(DatabaseException.java:116) 
    at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:309) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:581) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:537) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1805) 
    at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:566) 
(..) 

是否有任何其他原因为什么它可以断开连接?

+0

既然你可以重现它在测试环境中,尝试开启日志记录,看看发生了什么导致到错误。日志记录可能会减慢速度,所以如果它是一个时间问题,可能会更难以重现,但会给你每个确切的场景。另一个要尝试的将是最新的EclipseLink版本,因为涉及堆栈跟踪的类自2.4.2以来有所改变。 – Chris

+0

谢谢@Chris,我启用了日志建议。为问题添加更多信息。 – zaza

回答

1

允许我回答我自己的问题,以便其他人可以从我的发现中受益。

问题原来是由Eclipse Link中的一个错误引起的。在撰写本文时,请参阅bug 432410

在我的具体情况的解决方案是避免unwraping连接即不叫EntityManager.unwrap(Connection.class)

相关问题