2011-10-16 61 views
4

我有3層EJB應用程序,我需要在厚客戶端(桌面Java應用程序)上創建一個視圖,以顯示一個非常大的對象集合(超過5000個訂單)。每個對象都有子屬性,同時也是複雜的對象,例如:非常大的對象集合的客戶端視圖。如何優化?

class Address 
{ 
String value 
// other properties 
} 

class Order 
{ 
public String Number 

// this is collection of complex object and I need first and last object to show it's 
// properties in view 
public List<Address> getAddresses() 

// other properties 
} 

的觀點是訂單的表:

號碼| FirstAddress | LastAddress | ...

我第一次嘗試加載命令的完整列表(無子屬性),然後需要時顯示動態下載子對象。但是當我有10000個訂單並開始快速滾動時,界面變得沒有反應。

然後我嘗試加載的所有訂單,需要在表中顯示所有的孩子,但用戶界面變得非常沉重和緩慢,可能是因爲存儲成本)。根本不是胖客戶端,因爲我從db下載了幾乎所有的數據。

什麼是解決這一任務的最佳做法?

回答

2

假設您使用JTable作爲合適的TableModel的視圖,請在數據庫到達時使用SwingWorkerpublish()查詢數據庫。爲了簡單起見,此example只是以10個塊爲單位提取隨機數據。請注意,隨着數據累積,UI保持響應。

+1

使用'發佈()'將工作**只有**服務(EJB側)提供了一個API來獲取數據,而不是讓整個列表一次的頁面。 – jfpoilpret

1

建議您儘量爲您的列表中的代理對象,只是獲取它的元素只有一小部分,而且總數量,然後有按需加載原始列表

2

的其他部件的能力按照值對象數據傳輸對象模式。只發送你真正需要的東西。不要發送域對象圖,只需爲每個視圖創建一個或多個「愚蠢」的平面對象(包含簡單屬性)。

2

我建議實施某種分頁的,換句話說,你必須實現一種機制來僅檢索所有數據的一小部分,並告訴他們由大塊大塊在不同的頁面。

究竟「怎麼做」取決於你的方法爲止。

  • 您可以使用像那些已經 提到了一些編程模式
  • 或者你可以在DB的水平,在那裏你查詢你的數據庫服務器, 即實現它取決於你得寫指定的DBMS以這樣的方式,他們只檢索所有 數據的一部分,就像here.

希望這有助於獲取
查詢!