我最近开始维护在OC4J上运行的旧的EJB2应用程序。这包括EJB doclet和其他可怕的可怕事情。目前,每种方法都创建一个ConnectionFactory
,用于查询JNDI Datasource
,然后创建一个连接。这导致了很多锅炉板代码。EJB2会话bean中的连接处理
我现在的问题是:每个无状态会话bean只做一次安全操作并重用相同的连接是否安全? ejbCreate()
将从JNDI获得连接,然后在ejbRemove()
中关闭它。
这是好还是坏的设计?
我最近开始维护在OC4J上运行的旧的EJB2应用程序。这包括EJB doclet和其他可怕的可怕事情。目前,每种方法都创建一个ConnectionFactory
,用于查询JNDI Datasource
,然后创建一个连接。这导致了很多锅炉板代码。EJB2会话bean中的连接处理
我现在的问题是:每个无状态会话bean只做一次安全操作并重用相同的连接是否安全? ejbCreate()
将从JNDI获得连接,然后在ejbRemove()
中关闭它。
这是好还是坏的设计?
由于生命周期方法由容器处理,所提出的设计将具有不可预知的行为。无状态会话bean由容器合并(在大多数情况下)&同一个实例可以服务于多个请求。
方法ejbCreate()
和ejbRemove()
被容器调用,当bean被初始化第一次初始化时&分别从池中被移除。因此它可能会在ejbCreate()
中打开一个连接,但可能不会用相同的连接关闭它的&服务请求。
但是,如果打开连接&豆保持在池中闲置,这将不必要地托起资源,像套接字超时异常可能最终,太多打开的连接等
其更好地写出了推广/关闭连接的概括方法,以恰当地利用资源。
编辑:从核心J2EE模式 - 服务定位器
使用服务定位器对象来抽象所有JNDI使用和隐藏 初始上下文创建的复杂性,EJB主对象的查找, 和EJB对象重新创建。多个客户端可以重新使用定位器对象来减少代码复杂性,提供单点控制,并通过提供缓存设施来提高性能。
其他会话bean如何?那些安全的在session bean中“缓存”(在ejbCreate中初始化),就像我目前正在使用连接一样? – 2012-01-31 08:49:58
请参阅编辑部分缓存无状态bean,这些bean不应该包含实例变量。 – 2012-01-31 17:14:06
请注意,如果实例变量消耗资源并且可共享,如缓存数据库中的某些数据,建议使用实例变量。 – 2012-02-01 17:03:31