Long running transactions might be killed by the App Server's Transaction Reaper. I have implemented a litte helper to programmatic handle such kinds of exceptions.
When invoking a method of an EJB we get features like transactions, security or monitoring for free. However, this only works when the method call is intercepted by the container. So, method calls within the same bean do not enjoy this benefits. There is a nice hack to solve this problem.