2014-01-17 49 views
0

某處我看到一段代碼這樣EJB性能

// T1

for(i=0;i<n;i++) 
{ 
    EJBLocator.getAbcRemote().updateByIndex(i); 
} 

,我可能認爲像下面的代碼會做得更好

// T2

List<Integer> indexes = new XXXList<>(); 
for(i=0;i<n;i++) 
{ 
    indexes.add(i); 
} 
EJBLocator.getAbcRemote().updateByIndexes(indexes); 

甚至

// T3

AbcRemore remote = EJBLocator.getAbcRemote();  
for(i=0;i<n;i++) 
{ 
    remote.updateByIndex(i); 
} 

只是想知道,在演出規模,在那裏將這些3種方法在於廣告爲什麼。

+2

你爲什麼不試試? –

回答

2

絕對使用T2!否則,每次更新都是一個單獨的事務:它的速度很慢,並且存在完整性的風險:索引號可能會因迭代之間的其他請求而發生變化。

我甚至會看看你之前正在執行的任何數據讀取(比如你如何生成n?),並將其轉移到EJB方法中,以便它們都在同一個事務中執行。

通常,如果您正在執行基於早期數據庫讀取所做決策的數據庫寫入操作,則應在同一事務中執行讀取和寫入操作。

這並不一定意味着您需要使用同一個EJB bean處理兩個活動。第一個EJB可以調用其他的EJB,並且它將全部在同一個事務中(默認情況下,你可以改變它)。但是,您的客戶端(例如Web應用程序)應僅針對特定操作調用一個EJB方法。

+0

值得注意的是,與本地通話相比,遠程通話費用較高。即使在同一個服務器中,規範也要求容器應該通過值來傳遞屬性。所以,T2是非常粗糙和簡單的。 – Sergio