You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by Daniel John Debrunner <dj...@debrunners.com> on 2005/01/22 17:34:46 UTC

Explaination to Derby-130 fix

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

The bug for Derby-130 was that the method IDENTITY_VAL_LOCAL was not
being reset when a new connection was returned from a PooledConnection
object.

http://issues.apache.org/jira/browse/DERBY-130

Connection pooling is implemented in Derby by maintaining a
EmbedConnection object as the "physical" connection for the lifetime of
the PooledConnection object. The application receives through
PooledConnection.getConnection() a BrokeredConnection object (as the
logical connection) that wraps the EmbedConnection. The application can
never obtain a reference to the underlying EmbedConnection.
When the connection is re-used a new logical connection will be
comprised of a new BrokeredConnection object and the existing
EmbedConnection. The EmbedConnection remains valid until it has some
failure that closes it or the PooledConnection object is explicitly closed.

I saw this bug when I was cleaning up the internal handling of
IDENTITY_VAL_LOCAL to use long and Long and not long and BigDecimal. I
could see that the initial value of IDENTITY_VAL_LOCAL was meant to be
NULL but there was no mechanism to reset it. Thus it most likely would
break with pooling.

The fix (svn revision 126039) was simple, a specific reset mechanism
already existed to drop temporary tables which are private to a
connection. This method was dropAllDeclaredGlobalTempTables. I used the
same logic but renaming the methods to resetFromPool. I kept the
dropAllDeclaredGlobalTempTables method as-is but private in
GenericLanguageConnectionContext and added a new resetFromPool method
that reset the identity state and called the
dropAllDeclaredGlobalTempTables method.

There could be other state that needs to be added to this reset
mechanism. EmbedPooledConnection handles the resetting of all state that
can be done through standard JDBC method calls, such as isolation level.

Finally I added some tests in checkDataSource which run the same test
over a PooledConnection returned from EmbeddedConnectionPoolDataSource
and an XAConnection from EmbeddedXADataSource. This is because
XAConnection also implements PooledConnection.


Dan.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFB8oCmIv0S4qsbfuQRAjbBAJ9FpoJXd3/B2fWgCoLVJxews5O+0gCguAmt
pZCDFFIDrz9glAwtTv4Wj1g=
=oNMk
-----END PGP SIGNATURE-----