StackOverflowError in commit
505924Sep 17 2007 — edited Dec 5 2007Using TopLink 10.1.3, I'm getting a StackOverflowError on a JTA commit:
[9/17/07 11:02:54:802 EDT] 00000029 RegisteredSyn E WTRN0074E: Exception caught from before_completion synchronization operation: java.lang.StackOverflowError
at oracle.toplink.internal.helper.IdentityHashtable$Entry.clone(IdentityHashtable.java:456) at oracle.toplink.internal.helper.IdentityHashtable$Entry.clone(IdentityHashtable.java:456)
at oracle.toplink.internal.helper.IdentityHashtable$Entry.clone(IdentityHashtable.java:456)
... thousands of lines like this ...
at oracle.toplink.internal.helper.IdentityHashtable$Entry.clone(IdentityHashtable.java:456)
at oracle.toplink.internal.helper.IdentityHashtable$Entry.clone(IdentityHashtable.java:456)
at oracle.toplink.internal.helper.IdentityHashtable.clone(IdentityHashtable.java:121)
at oracle.toplink.publicinterface.UnitOfWork.commitToDatabaseWithChangeSet(UnitOfWork.java:1356)
at oracle.toplink.publicinterface.UnitOfWork.issueSQLbeforeCompletion(UnitOfWork.java:2840)
at oracle.toplink.publicinterface.UnitOfWork.issueSQLbeforeCompletion(UnitOfWork.java:2820)
at oracle.toplink.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:96)
at oracle.toplink.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:55)
at com.ibm.ws.Transaction.JTA.RegisteredSyncs.distributeBefore(RegisteredSyncs.java:240)
at com.ibm.ws.Transaction.JTA.TransactionImpl.prePrepare(TransactionImpl.java:2373)
at com.ibm.ws.Transaction.JTA.TransactionImpl.stage1CommitProcessing(TransactionImpl.java:1606)
at com.ibm.ws.Transaction.JTA.TransactionImpl.processCommit(TransactionImpl.java:1577)
at com.ibm.ws.Transaction.JTA.TransactionImpl.commit(TransactionImpl.java:1512)
at com.ibm.ws.Transaction.JTA.TranManagerImpl.commit(TranManagerImpl.java:237)
at com.ibm.ws.Transaction.JTA.TranManagerSet.commit(TranManagerSet.java:162)
at com.ibm.ws.Transaction.JTA.UserTransactionImpl.commit(UserTransactionImpl.java:285)
at com.ibm.ejs.container.UserTransactionWrapper.commit(UserTransactionWrapper.java:264)
It appears that IdentityHashtable.Entry.clone() has a recursive implementation and the hashcode of a lot of my objects is identical. I tried overwriting hashCode(), but the that doesn't help - I put a breakpoint in hashCode, the code never goes there, perhapsTopLink uses System.identityHashCode or something else.
Could the TopLink developers write a non-recursive implementation of IdentityHashtable.Entry.clone()?