2012-07-25 61 views
1

的問題MSSQL運行存儲過程多次同時

我有一個CakePHP程序中,我調用存儲過程:

$this->FileUpload->query('exec sproc_runjob_ProcessTests', false); 

此過程拿起一個上傳的文件並處理它。有時候人們會上傳多個文件,每上傳一個文件就會調用一次。

的問題是,我得到這個錯誤:

Database Error 
Error: SQLSTATE[42000]: 
    [Microsoft][SQL Server Native Client 11.0][SQL Server] 
    SQLServerAgent Error: Request to run job ProcessTests 
    (from User [redacted]) refused because the job already has 
    a pending request from User [redacted]. 
SQL Query: exec sproc_runjob_ProcessTests 

據我所知,這意味着存儲過程不能同時運行 - 我會運行每個存儲過程這是我們看中的新型多核服務器的恥辱。

解決方案,我們已經想到了

  1. 運行存儲過程連續

    基本上這裏的想法是一次調用存儲過程,則忽略它的失敗,如果它已經運行。在sproc調用結束時,它會檢查數據庫,看它是否需要再次運行(如果有「新」文件),並在這種情況下再次運行。

  2. 不要使用現有的存儲過程

    這將是困難的,因爲時間的限制,但是如果有人對我們應該做這樣的方式一個很好的建議,我會很高興聽到。

在此先感謝!

搜索結果

  1. 看起來this guy有同樣的問題,並通過調用之前檢查作業狀態解決它。也許我可以在進行sproc調用之前從PHP執行此操作?

  2. Here's a mention一個叫做Service Broker的東西。這可能實際上是我正在尋找的,但我仍然喜歡任何輸入。

在此先感謝!

回答

0

從您收到的錯誤消息中,聽起來像您的存儲過程試圖啓動在SQL代理中註冊的SQL作業。如果那是真的,那麼我會推薦另一種策略。

理想情況下,您應該直接將文件作爲二進制類型(如圖像或blob)傳遞給存儲過程。讓數據庫的多線程處理併發請求的擴展。否則,如果您嘗試連續處理文件,應用程序將無法很好地擴展。

Service Broker確實是一個允許您的應用以不同方式連接到數據庫的端點。是的,你可以使用它 - 它會起作用,但我會因此而起作用。

或者,您可以繼續在文件系統上存儲文件,並且只存儲文件在數據庫中的路徑。

祝你好運!