通用規則
一下的幾條規則可以有效地提高EJB的效能,不過請留意把一個應用分解成很多個EJB元件會減低效能。EJB元件不是簡單的Java 對象,, 他們是包含遠程介面調用,安全,事務以及屬性和方法的元件。
使用高效能的Beans
儘可能多的使用高效能的EJB能從整體上提高你的應用的效能。
一下是EJB元件的種類,從高效能到地效能排列:
- 無狀態對話Bean(Stateless Session Beans) 和 訊息驅動Beans(Message Driven Beans)
- 狀態對話Beans(Stateful Session beans)
- 配置成唯讀Container managed Persistence(CMP) entity beans.
- 配置成唯讀Bean managed Persistence(BMP) entity beans.
- CMP beans.
- BMP beans.
使用緩衝
合理的使用緩衝可以大大地(Greatly)提高效能,例如:
- 緩衝EJB引用(Cache EJB references): 用來避免每個request都有JNDI查詢, 在servlet裡面緩衝EJB引用。
- 緩衝EJB的home介面:因為頻繁的調用home介面非常昂貴,所以可以在servlet的init()方法裡面緩衝EJBHomes。
- 緩衝EJB資源(EJB resources):使用setSessionContext()或者ejbCreate()來緩衝EJB resources. 這又是一個使用Bean生命週期方法來執行應用的操作。記得在ejbRemove()方法裡面釋放獲得的資源。
使用合理的Stubs
當EJB的用戶端需要的時候,應用中所需的的Stub類是在動態運行中產生的。這就說明在部署一個有遠程EJB元件的時候是不需要產生Stubs或者retrieve用戶端Jar檔案的。在部署應用的時候,不再需要指定retrieve選項,這樣會提高不熟的速度。
去掉不需要的狀態對話bean
去掉不需要的狀態對話Bean能避免passivating他們,passivating需要磁碟操作。
緩衝(cache)和 池(Pool)調整技巧
- 明確的調用remove()方法:允許在EJB用戶端明確的調用remove()方法來remove容易中緩衝的狀態對話Bean
- 調整實體Bean的池大小:實體Bean用到了EJB池和緩衝設定,調整實體bean池的大小來最小化bean的建立和摧毀。設定池的大小為一個穩定的非零的size會得到更好的反應速度。
- 緩衝與Bean相關的資源: 使用setEntityContext()方法來緩衝與Bean相關的資源,然後用unSetEntityContext()方法釋放他們。
- Identify(確認) 唯讀(read-only) beans:把只進行唯讀操作的ejb配置成唯讀ejb.
使用Local和remote介面
這一段主要探討一些當EJB元件被local或者remote客戶調用是的考慮。
推薦使用本地介面(Local Interfaces)
一個EJB元件可以擁有遠程和本地介面,如果用戶端和EJB不是在同一個伺服器執行個體運行,需要使用遠程介面來訪問EJB.調用遠程介面需要
Marshalling Arguments, 還需要通過網路傳輸編碼過得(marshalled)data,
反編碼(un-marshaling)arguments 和 在接收結束的時候dispatch資料。另外,使用remote
介面需要很大的資源(significant overhead).
如果EJB 元件有local介面,那麼在同一個伺服器執行個體的本地用戶端可以調用本地介面而不是遠程介面,使用本地介面更有效,因為不需要argument marshaling, 傳輸和un-marshalling.
如果一個EJB只被local用戶端調用,那麼可以只提供local 介面, 如果EJB是分開部署的,那麼你應該同時提供本地介面和遠程介面,這樣遠程客戶就可以調用遠程介面,本地介面調用本地介面。
使用引用傳遞
預設情況下,Application Server使用值傳遞方法法調用遠程介面,就算他是在一起的(co-located)的, 這樣會很昂貴,因為用戶端使用值傳遞必需要在傳遞參數之前複製他們。
不管怎樣,本地用戶端可以使用引用傳遞,這樣本地和遠程介面可以共用傳遞過去的對象,但是這也說明參數對象必須被合理的實現(implemented),所以他們才能被共用。一般情況下,在可能使用引用傳遞的情況下使用應用傳遞會更高效。
合理的使用本地和遠程介面會使用戶端更高效的訪問EJB元件, 就是本地介面使用本地介面和引用傳遞,遠程介面使用遠程介面和值傳遞。
但是,在一些情況下並不能使用本地介面,例如:
- 在EJB2.0 specification之前的應用,沒有local介面。
- 有一些bean-to-bean調用,而且這些用戶端的bean根本沒有對被調用的bean做co-location的假設。
提高EJB事務的效能
- 使用容器管理的事務(Use Container-Managed Transactions)
- 不要包含使用者輸入時間(Don’t Encompass User Input Time):為了避免資源被長時間不必要的佔用,一個事務不應該包含使用者輸入時間或者使用者考慮時間,我的理解是盡量把你的transaction寫的短。
- 區分非事務的方法:聲明session EJB的非事務方法為NotSupported 或者NeverTransaction 屬性。這些屬性可以在ejb-jar.xml部署描述符檔案中找到。事務應該在最短的時間完成因為他們會鎖資料庫的rows.
- 為長的事務鏈(Long Transaction Chains)使用TX_REQUIRED
- 使用最低消耗的資料庫鎖:使用資料庫提供的最低消耗的資料庫鎖,在事務完成的時候提交資料而不要在每一個方法調用之後。
- 只有在需要的時候使用XA-Capable資料來源:當多個資料資源,連結資源或者JMS資源都在同一個transaction中使用時,需要執行
一個分布的或者全域的事務,這樣的話就需要XA capable資源管理員和資料來源。只有在兩個或者兩個以上資料來源在同一個事務中使用的時候再使用XA
capable
資料來源。當一個資料庫部署在一些分布式的事務中,但是絕大多數都是本地的或者單個的資料庫事務,那麼就應該註冊兩個不同的JDBC源,然後在應用中使用合
適的那一個。
使用消耗最低的Transaction Attribute
在EJB deployment 描述檔案中(ejb-jar.xml)中設定以下事務屬性。以最好效能到最低效能列出如下:
- NEVER
- TX_NOTSUPPORTED
- TX_MANDATORY
- TX_SUPPORTS
- TX_REQUIRED
來自我的小站 www.threes.cn