2011-05-07 52 views
0

我有一個運行多個線程的應用程序,其中過程的一部分,涉及製造HTTP POST請求,我提交的參數在數據庫中檢查是否已經存在,如果沒有則插入一個Web服務。的WebRequest服務VS本地數據庫搜索

數據庫本身託管在應用程序運行在同一臺服務器上。我們最初曾將它託管在不同的服務器上,但它崩潰,硬件故障......並且無法處理我每秒創建的所有請求。

現在我正在做請求服務時服務器的錯誤,並想知道哪種方法會更有效,更快...而且容易出錯少...

  1. 使用提出請求的現有方法在服務和解決此問題或
  2. 訪問數據庫在本地自己和檢查表並執行插入自己這顯然會拖慢進程

我想避免此問題,程序員是設置服務說他已經完成了他所做的一切,我應該更多地處理我的請求,但是我仍然不明白爲什麼突然之間我在移動之前突然出現主鍵違例錯誤,如果我發送了一個已經存在於表我會收到設置的響應,而不是內部服務器錯誤。

+0

你沒有提到你得到確切的錯誤 - 我假設你正在PK衝突錯誤? – 2011-05-07 19:58:02

回答

1

Webservice的請求是異步的,所以你將不能夠佔到PK衝突錯誤。有多種方法來處理這種情況:

  1. 託管代碼的Web服務應改爲處理這種情況,當PK存在,它應該返回時,第一次請求被髮送它給了同樣的反應。調用請求是獨立的,並且在單獨的線程上,並且永遠不會知道另一個請求已經插入了相同的值。 WS的全部重點在於,多個請求可以同時從任何地方進入。業務邏輯應該處理它們在同一時間進來。

  2. 更改您的代碼直接訪問數據庫(如你所提到的)。這不會使進程變慢(儘管工作涉及到更改代碼),因爲WS請求必須通過HTTP協議,而從代碼中,您將通過代碼提供的ADO或OLEDB提供程序直接訪問。

  3. 你可能排隊的請求,然後通過一個打一個,並且直到一個處理收到的響應不會打到下一個。我不喜歡這個,因爲它沒有可擴展性 - 連敗WS的目的,(但你可以用這個被卡住如果程序員不改變WS代碼)

由WS編碼器提出的解決方案是荒謬的。沒有辦法將您的請求分隔開來,這樣它不會導致PK違規。你無法知道哪些已經被插入,或者其他請求已經在處理中。此外,分隔請求不會使整個應用程序可擴展 - 您的前端(或其他任何正在等待響應)將最終等待。

+0

也許你的#1&#3的混合體......提交後,請求排隊。主Web服務線程產生子線程來完成這項工作。每個子線程在隊列中被分配一個不同的項目。子線程處理其工作並將結果作爲對原始隊列的更新或響應隊列中的新項目返回。事務隔離級別可以用來保持子線程的一致性。隊列管理可以在db(服務代理)中。然後,您可以通過限制子線程的數量並選擇檢查結果的頻率來控制吞吐量。 – 2011-05-07 20:40:04

+0

是的,這將工作(也需要一些前期工作)。雖然排隊可能是唯一的選擇,但我並不是這種情況下的粉絲,因爲如果應用程序獲得大量命中,它將成爲瓶頸 - 根據應用程序的要求產生具有頻率的子線程可能無法處理由WS主機 - 這是我真正認爲應該處理的地方... – 2011-05-07 20:51:51

+0

而且,當然,由於Oded的應用程序與SQL在同一臺服務器上,因此資源使用情況將變得更加重要。最後,我完全同意M.R.的意見,即「排除」這些請求是一種無法解決的問題。我看到它的方式,您要麼調整以避免過度爭用,要麼在工作負載嚴重的情況下使用隊列。 – 2011-05-08 17:09:23