Emanuel Freitas created DBCP-484:
------------------------------------
Summary: Connection leak during XATransaction in high load
Key: DBCP-484
URL: https://issues.apache.org/jira/browse/DBCP-484
Project: Commons Dbcp
Issue Type: Bug
Affects Versions: 2.2.0
Reporter: Emanuel Freitas
We're experiencing a connection leak in a distributed transaction when the
system is under heavy load. We're using commons-dbcp (latest version) +
eclipselink and narayana to perform transaction coordination.
>From time to time we can see a stacktrace reporting an abandoned connection.
>We are trying to figure out what's the root cause and we think that might be
>some issue in the commons dbcp (not sure) . More specifically, this parte of
>the code:
ManagedConnection#updateTransactionStatus
{code:java}
if (transactionContext != null) {
if (transactionContext.isActive()) {
if (transactionContext !=
transactionRegistry.getActiveTransactionContext()) {
throw new SQLException("Connection can not be used while enlisted
in another transaction");
}
return;
}
// transaction should have been cleared up by TransactionContextListener,
but in
// rare cases another lister could have registered which uses the
connection before
// our listener is called. In that rare case, trigger the transaction
complete call now
transactionComplete();
}{code}
If the transactionContext is different than null but the state is not "active"
(ex: STATUS_ROLLEDBACK, STATUS_ROLLING_BACK, etc) it executes the
transactionComplete mothod that clears the reference to a shared connection and
after that the connection is never closed (returned to the pool).
If we move the transactionComplete(); to an else,(see below), the connection
leak does not happen.
{code:java}
if (transactionContext != null) {
if (transactionContext.isActive()) {
if (transactionContext !=
transactionRegistry.getActiveTransactionContext()) {
throw new SQLException("Connection can not be used while enlisted
in another transaction");
}
return;
}
} else {
transactionComplete();
}{code}
After this the dbcp unit tests still pass but I'm not sure about this changes.
Can you please check?
Thanks
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)