2012-01-30 41 views
0

我最近開始維護在OC4J上運行的舊的EJB2應用程序。這包括EJB doclet和其他可怕的可怕事情。目前,每種方法都創建一個ConnectionFactory,用於查詢JNDI Datasource,然後創建一個連接。這導致了很多鍋爐板代碼。EJB2會話bean中的連接處理

我現在的問題是:每個無狀態會話bean只做一次安全操作並重用相同的連接是否安全? ejbCreate()將從JNDI獲得連接,然後在ejbRemove()中關閉它。
這是好還是壞的設計?

回答

1

由於生命週期方法由容器處理,所提出的設計將具有不可預知的行爲。無狀態會話bean由容器合併(在大多數情況下)&同一個實例可以服務於多個請求。

方法ejbCreate()ejbRemove()被容器調用,當bean被初始化第一次初始化時&分別從池中被移除。因此它可能會在ejbCreate()中打開一個連接,但可能不會用相同的連接關閉它的&服務請求。

但是,如果打開連接&豆保持在池中閒置,這將不必要地托起資源,像套接字超時異常可能最終,太多打開的連接等

其更好地寫出了推廣/關閉連接的概括方法,以恰當地利用資源。


編輯:從核心J2EE模式 - 服務定位器

使用服務定位器對象來抽象所有JNDI使用和隱藏 初始上下文創建的複雜性,EJB主對象的查找, 和EJB對象重新創建。多個客戶端可以重新使用定位器對象來減少代碼複雜性,提供單點控制,並通過提供緩存設施來提高性能。

+0

其他會話bean如何?那些安全的在session bean中「緩存」(在ejbCreate中初始化),就像我目前正在使用連接一樣? – 2012-01-31 08:49:58

+0

請參閱編輯部分緩存無狀態bean,這些bean不應該包含實例變量。 – 2012-01-31 17:14:06

+0

請注意,如果實例變量消耗資源並且可共享,如緩存數據庫中的某些數據,建議使用實例變量。 – 2012-02-01 17:03:31