The CCM (Cached ConnectionManager) is optional.
A well written app (by which I mean one that doesn't use all the bad patterns
provided by the spec) doesn't need the CachedConnectionInterceptor.
Its main use for well written apps, is to catch unclosed connections
If you start doing non-scalable stuff like unshared connections then
you do need it.
The other reason for the CachedConnectionInterceptor is lazy
transaction enlistment e.g.
Connection c = dataSource.getConnection();
UserTransaction ut = // do lookup;
ut.begin(); // the CCM enlists the connection in the transaction