2012-11-04 32 views
1

的設置是這樣的:如何忽略「該進程無法訪問該文件,因爲它正由另一個理線」

每當我的網站上出現錯誤,則顯示錯誤的現場,而一封郵件正在發送給管理員。

該網站通過AJAX和XML顯示大量實時統計信息,每15秒自動更新一次。但是統計數據只是每15秒計算一次,不管有多少用戶。

  • 網站檢查,如果時間戳超過14秒
  • 如果是,那麼它更新的時間戳和運行統計數據的計算和: 這是通過隱藏IND的MSSQL數據庫的時間戳進行它們保存到XML
  • 最後,XML被遍歷並顯示給用戶

如果時間戳是年齡不超過15秒請求統計,第二個步驟被跳過。

現在我的問題是,如果2個用戶在同一時間做出時間戳請求,那麼系統沒有時間在兩個用戶嘗試更新XML文檔之前更新時間戳,導致其中一個失敗,出現錯誤消息:

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

是否可以檢查是否正在使用前試圖保存XML文件的過程?或者可能忽略這種明顯的錯誤?

回答

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秒/分鐘手動釋放鎖定。

+0

我會馬上看看這個! – Behrens

+0

將應用程序功能與我當前的功能結合起來非常完美!謝謝! – Behrens

+0

乾杯,很高興我能幫上忙! –

0

使用時間戳從數據庫中移開。

結帳the code here;只需將持續時間設置爲15秒,然後查看是否按照您希望的事情發生。

+0

這裏的問題是,如果系統完全空閒,那麼後臺任務仍然處於活動狀態,並且每秒都會執行此操作。 – Behrens

+0

設置時間戳,然後設置用戶上次在線的時間,在過去15-20秒內檢查用戶是否在線。 – mabako

+0

這也可以與ASP Classic一起使用嗎? – Behrens

相關問題