如果不了解你的用例,很难建议一个好的方法,但很可能你在你的EJB bean上调用一个方法,执行时间太长,逐渐耗尽池中的实例,直到调用者没有剩下处理。随着越来越多的对此操作的请求进入,EJB容器将尝试向客户端提供池中的下一个免费项目。通常,如果bean实例上的操作完成,则实例将返回到池中,并可用于下一个客户端调用。如果操作需要很长时间,则池将耗尽,直到没有可用的实例来为客户端调用提供服务。根据您的配置,EJB容器有20个实例;如果没有,它将尝试等待5分钟,是否某些实例不会返回到池中。如果它在那段时间内无法获取实例,它会将上述错误抛给调用者。 那么这导致我们: 首先是最重要的 的 分析花费那么长时间的EJB操作 强> (向部署中添加一个简单的EJB拦截器非常有用,它可以跟踪EJB调用的开始和结束以及跟踪执行时间) 的 确定谁调用该EJB实例 强> - 也许它正在对该bean进行过多的调用。 如果无法避免或优化长时间运行的操作,请增加池大小,以便客户端可以使用该bean的更多实例(调整 max-pool-size )
max-pool-size
如果您的用例需要长时间运行,但需要阻塞并等待其结果,请考虑异步处理以及JMS队列 - 在队列中创建作业,然后使用MDB执行它们。您仍然可以通过DB存储和查询处理状态。