2017-08-31 99 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)

相關問題