我最近开始维护一个在OC4J上运行的旧EJB2应用程序。这包括EJB doclet和其他可怕的事情。目前,每个方法都会创建一个ConnectionFactory
,用于查询 JNDI 以获取Datasource
,然后创建连接。这导致了很多样板代码。
我现在的问题是:每个无状态会话 Bean 只执行此操作一次并重用相同的连接是否安全? ejbCreate()
将从 JNDI 获取连接,然后在 ejbRemove()
中关闭它。
这是好设计还是坏设计?
建议的设计将具有不可预测的行为,因为生命周期方法由容器处理。无状态会话 Bean 由容器池化(在大多数情况下(,并且同一实例可以提供给多个请求。
当 bean 首次初始化时和从池中删除 bean 时,容器分别调用方法 ejbCreate()
和 ejbRemove()
的方法。因此,它可以在ejbCreate()
中打开一个连接,但可能不会关闭它,并且不能关闭具有相同连接的服务请求。
但是,如果连接被打开并且 bean 在池中保持空闲状态,它将不必要地占用资源,最终可能会出现套接字超时、打开的连接过多等异常。
最好编写一个通用的方法来打开/关闭连接,以正确利用资源。
编辑:从核心 J2EE 模式 - 服务定位器
使用服务定位器对象抽象所有 JNDI 用法并隐藏 初始上下文创建的复杂性,EJB主页对象查找, 和 EJB 对象重新创建。多个客户端可以重复使用该服务 定位器对象可降低代码复杂性,提供单点 通过提供缓存工具进行控制并提高性能。