1

問題

ストアド プロシージャを呼び出す CakePHP アプリケーションがあります。

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

この手順では、アップロードされたファイルを取得して処理します。複数のファイルをアップロードする場合があり、アップロードされたファイルごとに 1 回呼び出されます。

問題は、次のエラーが発生することです。

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

私が知る限り、これはストアド プロシージャを同時に実行できないことを意味します。プロセスごとに sproc を連続して実行する必要があり、これは私たちの豪華な新しいマルチコア サーバーでは残念なことです。

私たちが考えた解決策

  1. sproc をシリアルに実行する

    基本的にここでの考え方は、ストアド プロシージャを 1 回呼び出し、既に実行されている場合は失敗を無視することです。sproc 呼び出しの最後に、データベースをチェックして、再実行する必要があるかどうか (「新しい」ファイルがある場合) を確認し、必要な場合はそれ自体を再実行します。

  2. 既存のストアド プロシージャを使用しない

    時間の制約もあって難しいと思いますが、こうすればいいという提案がありましたら、よろしくお願います。

前もって感謝します!

の検索結果

  1. この男も同じ問題を抱えているようで、電話する前にジョブのステータスを確認することで解決しています。おそらく、sproc 呼び出しを行う前に PHP からこれを行うことができますか?

  2. Service Broker と呼ばれるものについて言及します。これは実際に私が探しているものかもしれませんが、それでも入力が大好きです。

前もって感謝します!

4

1 に答える 1

0

取得したエラーメッセージから、ストアドプロシージャがSQLエージェントに登録されているSQLジョブを開始しようとしているように聞こえます。それが本当なら、私は別の戦略をお勧めします。

理想的には、ファイルをimageやblobなどのバイナリタイプとしてストアドプロシージャに直接渡す必要があります。データベースのマルチスレッド化で同時リクエストのスケーリングを処理できるようにします。そうしないと、ファイルをシリアルに処理しようとすると、アプリケーションが適切にスケーリングされません。

Service Brokerは、実際には、アプリが別の方法でデータベースに接続できるようにするエンドポイントです。はい、あなたはそれを使うことができます-それはうまくいくでしょう、しかし私はそれに対して因果関係があります。

または、ファイルシステムにファイルを保存し続け、ファイルへのパスのみをデータベースに保存することもできます。

幸運を!

于 2012-07-30T01:19:23.840 に答える