I agree with John's idiom of putting the close() call in a finally block. I think most people do it that way, which may be why this bug was never uncovered before.
But I also think Anjan's right that this is a bug, and I've just corrected the behavior and added a unit test that demonstrates. (Actually, it was really easy, we already had a flag called "_closed" in PoolableConnection that told us whether or not the PoolableConnection was "active" or "idle" in the pool. We just weren't using it in isClosed().) A current build from source, or the next nightly distribution should contain the fix. - Rod