提高
EJB性能的十大技巧
項目進(jìn)行到這里,開(kāi)始出現新的問(wèn)題。EJB調用是耗時(shí)、費力的。怎么提高EJB的性能?我們?yōu)榻鉀Q這一問(wèn)題,開(kāi)始邊寫(xiě)邊討論。等到完成了,我才發(fā)現,我們所應用的技巧總結一下,竟有十條。把提高EJB性能的這些技巧總結一下,為以后的項目做參考。
1.用一個(gè)Session Bean封裝多個(gè)Entity Bean,將原來(lái)的多個(gè)Entity Bean的Remote調用和Local調用封裝在一個(gè)Session Bean中。所以建立一個(gè)ServerFacade,它為多個(gè)對象提供統一獲取EJB Home和獲取對象的接口。ServerFacade為程序要用到的所有EJB的home handle提供緩存,提高訪(fǎng)問(wèn)JNDI Name的時(shí)間,達到提高訪(fǎng)問(wèn)效率的目的。以后查找JNDI Name的方法都應寫(xiě)在接口里,調用時(shí)直接從接口調用。
2.在EJB的Remote接口中使用粗粒度的方法,不推薦使用細粒度方法。
3.如果EJB的Remote接口獲取成功,應不再使用Remote接口,而是將Remote接口構造成一個(gè)一般的
Java對象,通過(guò)調用一般的JAVA對象的方法來(lái)達到減少對網(wǎng)絡(luò )的訪(fǎng)問(wèn)。
4.如果你部署EJB客戶(hù)端和EJB在相同的JVM上,建設使用EJB2.0規范的Local接口代替Remote接口。
5.用"transient"關(guān)鍵字聲明不必要的數據變量,替代以前的"public"、"private"等,避免不必要的數據變量占用網(wǎng)絡(luò )資源。示例:
public class DemoCMP implements EntityBean {
transient EntityContext entCtx;
transient InitialContext initCtx;
public String id;
public String description;
…
}
6.在ejb-jar.
XML部署文件中,對Session Bean中非事務(wù)的方法,將trans-attribute屬性賦為"NotSupported"或"Never"
<ejb-jar>
…
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>abookesessionBean</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
7. 設置事務(wù)的超時(shí)時(shí)間,在JBoss中,要修改${jboss.home}/server/${jboss.configuration}/conf/jboss-service.xml ,如下所示:
<server>
…
<mbean code="org.jboss.tm.TransactionManagerService"
name="jboss:service=TransactionManager">
<attribute name="TransactionTimeout">300</attribute>
</mbean>
…
</server>
8.當事務(wù)鎖定
數據庫的行記錄時(shí),事務(wù)應跨越可能的最小的時(shí)間。
9.調整EJB
服務(wù)器的各種參數,如
線(xiàn)程數、EJB池大小、連接池參數等。以在JBoss修改連接池參數為示例,進(jìn)行說(shuō)明。如果JBoss和
MySQL相連,配置${jboss.home}/server/${jboss.configuration}/deploy/mysql-service.xml,來(lái)修改連接池參數,包括MinSize、MaxSize、BlockingTimeoutMillis、IdleTimeoutMinutes、Criteria等,各參數的含義如下所示:
i.MinSize :連接池保持的最小連接數。
ii. MaxSize :連接池保持的最大連接數。
iii. BlockingTimeoutMillis :拋出異常前最大的等待連接時(shí)間。
iv. IdleTimeoutMinutes :關(guān)閉連接前連接空閑的最大時(shí)間。
v. Criteria :有ByContainerAndApplication、ByContainer、ByApplication和ByNothing等值。
下面是一個(gè)例子:
<depends optional-attribute-name="ManagedConnectionPool">
<!--embedded mbean-->
<mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"
name="jboss.jca:service=LocalTxPool,name=MySqlDS">
<attribute name="MinSize">0</attribute>
<attribute name="MaxSize">50</attribute>
<attribute name="BlockingTimeoutMillis">5000</attribute>
<attribute name="IdleTimeoutMinutes">15</attribute>
<attribute name="Criteria">ByContainer</attribute>
</mbean>
</depends>
10.對于數據庫事務(wù),應選擇較低成本的事務(wù)等級,避免造成壞數據。遞增成本的事務(wù)等級包括:
TRANSACTION_READ_UNCOMMITED,
TRANSACTION_READ_COMMITED,
TRANSACTION_REPEATABLE_READ,
TRANSACTION_SERIALIZABLE