This seems like a race condition, and I am not sure that switching the
DB fixes it. I just don't understand how it can possibly happen. Do
you have "Container Managed Transactions" set to on by any chance?
Andrus
On Jun 8, 2010, at 1:26 PM, Andrea Pavan wrote:
Sorry for double post, it's my first time :)
Anyway, I solve the problem using H2 instead of Derby and, for now,
all
works like a charm!
2010/6/8 Andrea Pavan <[email protected]>
Hi,
I have a very strange problem with Cayenne 3.0 and Derby Embedded
database.
When i execute my application, first runs a query, then when runs the
second one (different from first), it raise this exception:
Exception in thread "Thread-5"
org.apache.cayenne.CayenneRuntimeException:
[v.3.0 Apr 26 2010 09:59:17] Global exception.
at
org
.apache
.cayenne
.access
.DataDomainQueryAction
.nextGlobalException(DataDomainQueryAction.java:553)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:
258)
at
org
.apache
.cayenne
.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:
422)
at
org.apache.cayenne.access.DataDomainQueryAction.access
$000(DataDomainQueryAction.java:69)
at
org.apache.cayenne.access.DataDomainQueryAction
$2.transform(DataDomainQueryAction.java:395)
at
org
.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:
840)
at
org
.apache
.cayenne
.access
.DataDomainQueryAction
.runQueryInTransaction(DataDomainQueryAction.java:392)
at
org
.apache
.cayenne
.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:121)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:743)
at
org
.apache
.cayenne
.util
.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:333)
at
org
.apache
.cayenne
.util
.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:
1278)
at
org.apache.cayenne.access.DataContext.performQuery(DataContext.java:
1267)
at
minica.server.actions.CANewCertAction.doAction(CANewCertAction.java:
46)
at
minica
.server.parsers.CANewCertParser.parseMessage(CANewCertParser.java:37)
at minica.server.CASocketReceiver.run(CASocketReceiver.java:73)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalStateException: Transaction must have
'STATUS_ACTIVE' to add a connection. Current status: STATUS_COMMITTED
at
org
.apache
.cayenne
.access.ExternalTransaction.addConnection(ExternalTransaction.java:
64)
at
org.apache.cayenne.access.DataNode
$TransactionDataSource.getConnection(DataNode.java:365)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:
248)
... 15 more
The second query is executed in a different thread.
This is a code I use to get the DataContext object:
public ObjectContext getContext() {
try {
return BaseContext.getThreadObjectContext();
} catch(IllegalStateException e) {
BaseContext
.bindThreadObjectContext(DataContext.createDataContext(false));
return BaseContext.getThreadObjectContext();
}
}
Both queries are simply SelectQuery:
1.
ObjectContext context =
CertificationAuthority.getInstance().getContext();
SelectQuery select1 = new SelectQuery(DBCertificate.class);
List<DBCertificate> l = context.performQuery(select1);
2.
ObjectContext context =
CertificationAuthority.getInstance().getContext();
Expression clause =
ExpressionFactory.matchExp(DBUser.NAME_PROPERTY,
subject);
SelectQuery query = new SelectQuery(DBUser.class, clause);
List<DBUser> result = context.performQuery(query);
The very strange thing is that the app raises exception only at
first time,
when DB is empty and, more strange, if I execute in debug mode, all
works
well !
I try anything but I don't find any solution.
Any suggestions?
*Andrea*