簡體   English   中英

在創建數千個子記錄后,Ember.js / Ember Data需要幾分鍾才能更新hasMany的父級

[英]Ember.js/Ember Data takes several minutes to update hasMany of parent after creating thousands of child records

我是Ember.js的新手,在嘗試創建數千條記錄(確切地說是5300)並更新hasMany關系時會遇到性能問題。 在創建新記錄之前,我正在向API請求檢索記錄。 在承諾返回之后,我然后對每個記錄下來的記錄(5300)執行forEach以對新記錄集進行計算。 創建記錄本身大約需要2秒鍾。 更新hasMany僅對前40個左右的記錄快速啟動,然后減慢到每秒約一個更新。

我還應該注意到,這是在一個組件內完成的。 我知道這通常是anit-pattern,但在這種情況下,沒有理由更改URL或轉換。 這是一個屏幕,用戶可以從一個項目池(由路徑提供)中進行選擇,應用定價規則,然后根據這些項目創建一個事件(在路徑中創建)。 這是一個沙箱,用於確定哪些項目將成為活動的一部分。 一旦用戶決定了他們的活動項目,我就會向該路線發送一個動作來執行實際的保存並持續到我的后端。 在反模式方面之外,我無法看到這將如何影響hasMany更新的性能。

我正在使用RESTAdapter和RESTSerializer來獲取它的價值,但這不應該對我有任何影響,因為我只是處理Ember數據存儲。

灰燼版:

Ember             : 2.5.1
Ember Data        : 2.5.3
jQuery            : 2.2.3
Ember Simple Auth : 1.1.0

有問題的兩個模型如下......

兒童模特(事件項目):

export default DS.Model.extend({
  event: DS.belongsTo('event'),
  itemNumber: DS.attr('string'),
  styleNumber: DS.attr('string'),
  tier: DS.attr('string'),
  eventPrice: DS.attr('number')
});

父模型(事件):

export default DS.Model.extend({
  eventTypeId: DS.attr('string'),
  eventName: DS.attr('string'),
  eventDesc: DS.attr('string'),
  startDate: DS.attr('moment-date'),
  endDate: DS.attr('moment-date'),
  priority: DS.attr('number'),
  statusCode: DS.attr('string'),
  value: DS.attr('number'),
  eventItems: DS.hasMany('event-item', {async:true})
});

活動創建記錄:

model() {
    return this.store.createRecord('event', {});
},

負責創建記錄和更新hasMany的組件中的代碼塊:

this.get('store').query('pricing', {brandCd: '00'}).then(tiers => {
    tiers.forEach(tier => {
        this.get('event').get('eventItems').createRecord({
            styleNumber: tier.get('styleNumber'),
            itemNumber: tier.get('itemNumber'),
            brandCd: '00',
            tier: tier.get('tier'),
            eventPrice: this._calculateEventPrice(tier.get('origPrice'), this.get('event').get('eventTypeId'), this.get('event').get('value')),
        });
    });

    this.get('event').set('needsUpdated', 'Y');
});

到目前為止,我已嘗試過以下內容......

  • 添加與我的hasMany和belongsTo的反向關系
  • 將所有創建記錄添加到Ember.A() ,然后嘗試將新記錄推送到hasMany,如下所示: this.get('event').get('eventItems').pushObjects(newEventItems); 還嘗試使用this.get('event').get('eventItems').addObjects(newEventItems);
  • 在正在創建的記錄上設置belongsTo,而不是更新父(事件)的hasMany。
  • 我也繼續前進並將這個邏輯移到我的路線中,以確保我在組件中執行此操作時沒有得到奇怪的行為。 它執行相同的操作。

我認為(如果我錯了請糾正我),嚴格在客戶端創建記錄和更新關系應該能夠處理數千條記錄而不會出現太多問題。 我希望我只是做一些不正確的事情,或者以一種效率低下的方式對那些經驗豐富的人來說是顯而易見的。 任何幫助,包括替代品,非常感謝!

我發現使用大量'hasMany'關系也很慢。

我的建議:使用自定義端點在服務器上構建關系,並通過websockets將更改傳回客戶端。 嘗試在Ember中單獨保存5300條記錄將產生5300個網絡請求,而這可以在1個出站請求中完成,可能還有一個websockets消息,盡管建議將響應批量處理為較小的集合。

在更改提交之前,無需在Ember中建立關系。 返回的websockets消息應該包含關系的外鍵Ember Data需要構建關系。

這意味着,在沒有父級的情況下,您將創建eventItems (或任何模型被調用)。

最后,您可以考慮按需創建子記錄,而不是嘗試立即為用戶創建每個子項。 當用戶決定從項目池中選擇項目時,只需執行createRecord (希望我能正確理解你的用例。)如果采用這種方法,你甚至可能根本不需要使用我所描述的自定義端點。

最后一點建議:你關於'反模式'的說明是正確的:永遠不要在組件中進行CRUD操作或任何真正的異步操作, 特別是對於5300項 在異步操作完成之前,可以輕松地拆除組件,使應用程序處於奇怪的狀態,並且很可能導致錯誤。 像你說的那樣將你做的任何事情移動到路線中,並堅持使用那種模式。 組件應該只是“啞”模板,顯示東西和發送動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM