2013-08-29 42 views
1

我有一個簡單的用例,但它並沒有進行優化,我想知道它是否可以。優化循環中的更新請求

比方說,我有一個包含一個ID和一個名爲price(實體被稱爲Product)可變一個簡單的實體。

我使用HibernateJPA並每隔一小時,我想更新我的產品的價格,所以這裏是僞代碼:

List<Product> products = Product.retrieveAll(); 
for (Product p : products) { 
    p.price = makeSomeComplexComputationsToGetNextPrice(); 
    p.save(); // Updates the entity in the DB 
} 

這段代碼是非常簡單的。 makeSomeComplexComputationsToGetNextPrice();使用CPU進行一些計算,並且速度很快。

當我有100種產品,一切正常(代碼使101個SQL請求),但讓我們說我有10萬件產品,該代碼使得10個001 SQL請求,它需要幾秒鐘。

這個用例是我真正的用例的簡化版本,但問題就在這裏:當我有太多的產品,它需要太多的時間來執行(因爲查詢的數量龐大)。

使用hibernateJPA,有沒有一種方法來優化這種用例? (此代碼應該不到一秒鐘來執行,它的花費比,因爲所有的查詢1S更多)

非常感謝你的幫助

+0

'makeSomeComplexComputationsToGetNextPrice'是爲了使用數據庫訪問? –

+0

爲什麼不嘗試先從數據庫中檢索數據,然後查詢/處理/計算數據? –

+0

@Christian這就是OP目前正在做的事情。 –

回答

2

使用批量傳輸來優化的最簡單方法。嘗試計算大小爲N的批量,然後同時存儲整個N個產品。不要爲每個存儲做出努力(打開連接,存儲,刷新,關閉連接),只能對每個批量執行一次

更容易是當你選擇的產品爲您bulksize的整數,有效地使其負載computeeach店內算法。

否則,選擇完美的批量大小可能會很棘手,因爲它取決於很多參數,例如對象大小,數據庫及其參數硬件等等,但通常可以通過嘗試不同的值並測量時間。

其他方式可能包括並行(似乎不正確,因爲你的IO是瓶頸)或調整你的數據庫。

+0

謝謝更新它們,而是如何存儲整個B品在使用Hibernate和JPA同一時間? –

+0

你要看看你的表設計,閱讀一些手冊或Google的DB +批量傳輸。我不是Hibernate或者JPA專家,對不起。通常,如果你把你的店的方法只有一個開放的連接,只有一個緊密聯繫帶來了不少性能。 – LastFreeNickname

1

由於@EricStein和@LastFreeNickname指出,使用批量插入,這是一個解決方案,如果我們談論的INSERT在p.save();
如果makeSomeComplexComputationsToGetNextPrice();命令正在一個DB調用一些SELECT請求,那麼它使首先查詢所有這些複雜計算所需的數據,然後對其進行操作(再次使用INSERTS的批處理技術)。