2012-10-19 38 views
10

在使用GWT requestfactory時,我觀察到性能很差。例如,一個將我的服務層2秒傳遞給fullfil的請求將GWT花費20秒來序列化。我的服務正在返回〜100什麼是EntityProxies。這些對象中的每一個都有4個ValueProxies和2個EntityProxies(100個根級別的EntityProxies,400個ValueProxies和200個額外的EntityProxies)。但是,我發現在更小的數據集上性能下降了10倍。日誌片斷的GWT Requestfactory性能建議

實施例:

D 2012-10-18 22:42:39.546 ServiceLayerDecorator invoke: Inoking service layer took 2265 ms 
D 2012-10-18 22:42:58.957 RequestFactoryServlet doPost: Entire request took 22870 ms 

我已經添加了一些配置代碼到ServiceLayerDecorator#invoke方法和包裹在一個定時器的整個的servlet。我已經自己介紹了這項服務,它的確在2秒內返回結果。

我使用GWT 2.4,但已經測試了這個在GWT 2.5rc1和GWT 2.5rc2。我的後端在GAE上,但我不認爲這是在這裏扮演的角色。

我發現this bug針對2.4,這似乎是非常相關的申請。沒有任何運氣,我手動應用了this google group的修補程序。

我的域模型的樣子:

class Trip { 
    protected Address origin; // becomes ValueProxy 
    protected Address destination; becomes ValueProxy 
    protected Set<TripPassenger> tripPassengers; // Set of ValueProxies 
} 

class TripPassenger { 
    protected Passenger passenger; 
} 

class Passenger { 
    protected Account account; 
} 

我的問題是:

  • 我有異形正確的代碼,並找出問題的GWT序列化?
  • 我可以做一些會導致這種行爲的錯誤嗎?
  • 我該如何更好地分析GWT序列化代碼以試圖找出原因?
+0

我認爲你的數據結構太複雜了。試着壓扁它。你再解釋一下,你的DTO是怎樣的?你使用AutoBean嗎? –

+0

我在該問題中添加了部分域模型。在一些更昂貴的那些中,這是正在加載的圖形。您是否有任何關於數據結構太複雜的參考?什麼是複雜的(大小或關係)?對我來說,任何商業應用程序似乎都是合理的。我已經開始關注AutoBean,並且正在考慮從服務器返回JSON。 – Brad

+0

我剛剛分析了加載〜10個EntityProxies(沒有ValueProxy或嵌套關聯)的請求。服務層花費了1秒,但GWT序列化花費了3秒多。 – Brad

回答

1
  • 我有異形正確的代碼,並找出問題的GWT序列化?

RequestFactory使用反射一大堆(GWT比-RPC例如更多),所以我真的不驚訝的是,它會導致在某些情況下,一些PERF的問題。 GAE可以在這裏發揮作用。
我相信RequestFactory(實際上是AutoBean部分)可以在構建時從代碼生成中獲益。

  • 可能我做錯了什麼,將導致此行爲?

檢查定位器find和/或isLive方法。

  • 我怎樣才能更好的配置文件中的GWT序列化代碼試圖找出原因在哪裏?

這也將是有趣的,知道用在要求的反序列化,應用更改,然後響應的序列化的時間。不要忘記減去在findisLive花費的時間。

+0

我將很快得到一個時間分類。我花了大部分時間來分析我的代碼,我注意到一件事情是包含域模型作爲參數的請求沒有昂貴的序列化時間。例如'Trip service.save(Trip t)'具有〜100ms的序列化時間。而'Trip service.find(String id)'具有接近12k ms的序列化時間。相同的圖形結構,但不同的上下文。此外,我的isLive方法被剔除以始終返回true。 – Brad

+0

有趣。隨意在GWT跟蹤器中用你發現的分析你的應用程序開啓一個新問題。提前致謝! –