Hi,

Hugi and I converted a large concurrent application from EOF to Cayenne over 
the last few months, and we tried taking it into production today for the first 
time. Mostly went fine, but we hit one problem:

Exception in thread "Thread-57" org.apache.cayenne.CayenneRuntimeException: 
[v.4.0.B2-SNAPSHOT Sep 11 2017 17:37:06] Commit Exception
        at 
org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:774)
        at 
org.apache.cayenne.access.DataContext.commitChangesToParent(DataContext.java:682)
        at 
com.selbstdenker.canusa.powerd.PDObjectContext.saveChanges(PDObjectContext.java:171)
        at 
com.selbstdenker.canusa.powerd.eo.PDCSimpleWebserviceRequestQueue.sendRequest(PDCSimpleWebserviceRequestQueue.java:349)
        at 
com.selbstdenker.canusa.powerd.eo.PDCSimpleWebserviceRequestQueue$QueueRunner.run(PDCSimpleWebserviceRequestQueue.java:136)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Transaction must have 
'STATUS_ACTIVE' to add a connection. Current status: STATUS_COMMITTED
        at 
org.apache.cayenne.tx.BaseTransaction.connectionAdded(BaseTransaction.java:246)
        at 
org.apache.cayenne.tx.CayenneTransaction.connectionAdded(CayenneTransaction.java:49)
        at 
org.apache.cayenne.tx.BaseTransaction.addConnection(BaseTransaction.java:231)
        at 
org.apache.cayenne.tx.BaseTransaction.getOrCreateConnection(BaseTransaction.java:203)
        at 
org.apache.cayenne.access.DataNode$TransactionDataSource.getConnection(DataNode.java:446)
        at 
org.apache.cayenne.dba.oracle.OraclePkGenerator.longPkFromDatabase(OraclePkGenerator.java:166)
        at 
org.apache.cayenne.dba.JdbcPkGenerator.generatePk(JdbcPkGenerator.java:215)
        at 
org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:162)
        at 
org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
        at 
org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
        at 
org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
        at 
org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
        at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:633)
        at 
org.apache.cayenne.access.DataDomain.onSyncNoFilters(DataDomain.java:603)
        at 
org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:764)
        at 
org.apache.cayenne.commitlog.CommitLogFilter.onSync(CommitLogFilter.java:85)
        at 
org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:764)
        at 
org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:73)
        at 
org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:70)
        at 
org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:87)
        at 
org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:51)
        at 
org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:40)
        at 
org.apache.cayenne.tx.TransactionFilter.onSync(TransactionFilter.java:70)
        at 
org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:764)
        at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:590)
        at 
org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:742)

There is only one application instance with one Cayenne stack. I do have other 
cases where the exact same code path did not produce problems, both before and 
after this exception happened. There's a lot of concurrency in this 
application, so it might only happen when this leads to a new connection being 
opened?

Any help is greatly appreciated.

Thanks
Maik

Reply via email to