1

セットアップは次のとおりです。

私のウェブサイトでエラーが発生するたびに、管理者に電子メールが送信されている間、エラーサイトが表示されます。

このWebサイトには、AJAXおよびXMLを介して15秒ごとに自動的に更新される多くのライブ統計が表示されます。ただし、統計は、ユーザーの数に関係なく、15秒ごとに1回だけ計算されます。これは、MSSQLデータベースに隠されたタイムスタンプによって行われます。

  • Webサイトは、タイムスタンプが14秒より古いかどうかを確認します
  • そうである場合は、タイムスタンプを更新し、統計の計算を実行してXMLに保存します
  • 最後に、XMLがループされ、要求された統計がユーザーに表示されます

タイムスタンプが15秒より前でない場合、2番目のステップはスキップされます。

私の問題は、2人のユーザーが同時にタイムスタンプ要求を行った場合、両方のユーザーがXMLドキュメントを更新しようとする前に、システムにタイムスタンプを更新する時間がないため、一方のユーザーがエラーメッセージ:

msxml3.dll (0x80070020)
The process cannot access the file because it is being used by another process.
/file.asp, line 310

XMLドキュメントを保存する前に、プロセスが使用されているかどうかを確認することはできますか?それとも、この明示的な種類のエラーを無視しますか?

4

2 に答える 2

1

単純なロックで問題が解決すると思います。

従来のASPロックでは、最上位のアプリケーション変数を設定することにより、Applicationオブジェクトを使用して実現できます。

計算を実行するコードで、これらの変更を行います。

If Application("Calculation_Lock")<>"" Then
    Application("Calculation_Lock") = Now()
    'do the calculation...
    'calculation in progress...
    'calculation in progress...
    'calculation in progress...

    'when it's all done:
    Application("Calculation_Lock") = ""
End If

最初は、アプリケーションレベルの変数が空になるため、最初のユーザーがIfステートメントを入力してから、ロックを割り当てます。ロックがアクティブである間、つまりアプリケーションレベルの変数が設定されている間は、それ以降の要求はすべて無視されます。

計算中にエラーが発生した場合、ロックが永久にアクティブのままになるリスクがあるため、安全にプレイするために、値(ロックが設定された時間)と現在の時間、およびX秒/分を超えて経過したかどうかを比較できます手動でロックを解除します。

于 2012-11-05T07:43:28.307 に答える
0

タイムスタンプを使用してデータベースから移動します。

ここのコードをチェックしてください; 継続時間を15秒に設定し、それが希望どおりに機能するかどうかを確認します。

于 2012-11-04T18:19:38.943 に答える