2009-09-07 113 views
0

我們有這個PHP應用程序從數據庫中選擇一行,對其進行處理(調用一個使用web服務的外部API),然後根據所做的工作插入一個新的寄存器。有一個AJAX顯示屏告知用戶已經處理了多少個寄存器。數據庫與一個數據庫的各種連接

數據主要是文本,所以它是相當重的數據。

該過程由一次數千個寄存器完成。用戶可以選擇多少個寄存器開始工作。這些數據是從一個表格中獲得的,在這裏他們被標記爲「完成」。沒有「WHERE」條件,除了可選的「WHERE date BETWEEN date1 AND date2」之外。

我們有一個說法在哪種方法更好:

  • 選擇一個寄存器,它的工作,並與他們插入新的數據
  • 選擇所有的寄存器,工作記憶和插入它們在所有工作完成後在數據庫中。

您認爲哪種方法對於使用PHP和PostgreSQL的Web環境最有效?爲什麼?

回答

1

這真的取決於你有多在乎你的數據(認真地):

是否可靠性事情在這種情況下?如果這個過程死了,你能重新處理一切嗎?或者不是嗎?

通常在調用遠程Web服務時,您不希望爲相同的數據項調用它兩次。也許有副作用(如信用卡收費),或者它可能不是一個免費的API ...

無論如何,如果你不關心潛在的重複處理,然後採取批處理方法。這很簡單,很簡單,而且很快。

但是,如果你關心的重複處理,那麼這樣做:

  1. 從表中選擇1個記錄更新的模式(即。在交易中與「處理」的狀態鎖定)
  2. 更新記錄
  3. 提交該交易

然後

  1. 過程記錄
  2. 更新的記錄內容, AND
  3. 將狀態設置爲「完成」或錯誤時出現「錯誤」。

您可以同時運行此代碼,而不用擔心它會自行運行。您將能夠確信相同的記錄不會被處理兩次。

您還將能夠看到任何「沒有成功」的記錄,因爲他們的狀態將爲「正在處理」以及任何錯誤。

+0

我認爲批處理方法的優點足以令人信服。我已經以這種方式實施了。這是一個網絡應用程序,所以我認爲一次加載所有的數據可能在服務器的內存上很糟糕? – 2009-09-09 19:40:40

0

如果數據很重,負載也很重,考慮到應用程序不是實時相關最好的方法是最明確地獲取所需數據並處理所有數據,然後將其放回。

無論語言的效率如何,如果打開單個項目並單獨處理它們,您可能正在關閉數據庫連接。這意味着如果您有1000個項目,您將打開並關閉1000個連接。這遠遠超過了返回所有項目並處理它們的開銷。

+0

這聽起來不像他正在爲每個項目啓動一個新的PHP腳本。即使他是,那麼pconnect也會抵消這一點。 http://us.php.net/manual/en/function.pg-pconnect.php – gahooa 2009-09-07 18:17:13