The thread local pool is designed to be used by a pool of threads. Because the pool of threads already limits the amount of instances that can be created the thread local pool doesn't need any multi-threading synchronizations. So the effective throughput is the highest possible.
The strict max pool will make certain only a limited set of instances are created.
Most call originate from a pool of threads (remoting pool, servlet thread pool), so using the thread local pool is best.
However for example the old EJB timer service creates a new thread per callback, so then you would need to use the strict max pool.
In this case the thread local pool should suffice.
Thanks for the explanation on thread local pool.
Just a note for those who's currently bound to old versions of JBoss.
The irony is that until EJBTHREE-2147 fixed in some version of JBoss AS 6 the ThreadlocalPool had much more synchronization overhead than StrictMaxPool.
And thanks for fixing this, Carlo.
Here is a way to externalize MDB maxSession property out of ear: