We use apache ode 1.3.3 inside Servicemix 3.3.2 for implementing our workflows. When the load increases (ie number of flow invocations per unit time ), ode freezes, stops processing new requests and hangs. Usullay, we solve the issue by doing a Servicemix restart after a cleanup of the 'data' folder.
Initially, i thought that this was a thread problem ( lack of threads for ode to use ). After increasing the 'thread pool size' in ode-jbi.properties, this problem got addressed to an extend. But still, under heavy load, ode continues to hang.
Further investigation, with additional logging revealed that under heavy load, ode is unable to get enough connections to the DB (NoManagedConnectionException ) to persist its state. Our ode persistence configuration is INTERNAL (refer to ode-jbi.db.mode=INTERNAL ) where the connection pool is maintained by the container/runtime itself. Efforts to migrate it to a EXTERNAL jndi datasource configuration ( where we can configure the connection pool parameters ) has not yet borne fruit ( Thanks to my inability to comprehend the zillion errors that keep cropping up at each stage :( :) )
So i tried the other available option, 'In-Memory execution' of my processes. This works fine in a 'test setup' and it no longer throws the 'NoManageConnectionException' under simulated load.
But i have a few concerns about moving this to PROD. How different is In-Memory execution different from 'persisted' execution ? How much more memory will this consume ? Will this affect the reliability of my PROD setup by causing 'OutOfMemoryOutages'.
We have about 10 deployed bpel processes. And the load (no. of requests )...well it is usually minimal, but sometimes spikes up ( that's where i need my processes to run really fast but without causing any OutOfMemory PROD outages...hopefully :D :) :P )
Need your thoughts, suggestions and advice on this.
Thanks in advance, Arun