2012-06-27 81 views
0

在我的MVC應用程序中,我每10秒使用一次重複的ajax調用。有時在數據庫服務器與應用程序服務器斷開連接之後,應用程序正在運行的瀏覽器中存在大量內存泄漏。由於重複ajax調用,內存泄漏和DB服務器連接失敗

我的代碼運行的,

我使用jquery.timer.js重複Ajax調用,每10秒

function class1() { 
} 

class1.prototype. funtion1 = function() { 
    $.ajax({ 
     type: "POST", 
     url: "/TestContoller/ActionOne", 
     success: function (result) { 
      $('#DivActionOne').html(result); 
     }, 
     traditional: true, 
     error: function (req, status, error) { 
     } 
    }); 
} 

//Likewise for funtion2, funtion3, funtion4, funtion5 

var count = 0; 
var timer = $.timer(function() { 
    $('#counter').html(++count); 
    var class1 = new class1(); 
    var funtionOne= class1.funtion1; 
    var funtionTwo= class1.funtion2; 
    var funtionThree= class1.funtion3; 
    var funtionFour= class1.funtion4; 
    var funtionFive= class1.funtion5; 
    var currentSec = count; 
    if ((currentSec % 10) == 0) { 
     funtionOne(); 
     funtionTwo(); 
     funtionThree(); 
     funtionFour(); 
     funtionFive(); 
    } 
}); 
timer.set({ time: 1000, autostart: true }); 

當連接丟失了我檢查跟蹤日誌,發現下面的錯誤消息:

消息:System.ServiceModel.CommunicationException:底層連接已關閉:預計將保持活動的連接已被服務器關閉。 ---> System.Net.WebException:底層連接已關閉:服務器關閉了預期保持活動狀態的連接。 ---> System.IO.IOException:無法從傳輸連接讀取數據:現有連接被遠程主機強制關閉。 ---> System.Net.Sockets.SocketException:現有連接被遠程主機 強制關閉在System.Net.Sockets.NetworkStream.Read(Byte []緩衝區,Int32偏移量,Int32大小) --- End內部異常堆棧跟蹤--- at System.Net.Sockets.NetworkStream.Read(Byte [] buffer,Int32 offset,Int32 size) at System.Net.PooledStream.Read(Byte [] buffer,Int32 offset,Int32大小) 在System.Net.Connection.SyncRead(HttpWebRequest請求,布爾userRetrievedStream,布爾probeRead) ---內部異常堆棧跟蹤--- 結束在System.Net.HttpWebRequest.GetResponse() 在System.ServiceModel .Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan超時) --- End of end異常堆棧跟蹤---

請幫我整理一下。

+0

更新與跟蹤日誌的問題。 –

回答

1

因爲您正在使用定時器而不是調用先前ajax調用回調函數上的下一個ajax請求。除非你把你的web服務器設置爲一個網絡花園(允許同時發出請求),否則你需要等到每個服務器完成後才能繼續下一個。

把你的ajax調用放到一個函數中,然後調用你的success回調函數,當它完成時再次運行。

當然,你需要設置一些類型的變量來確定它是否完成,因此它不會無限循環。

除此之外的任何東西都需要服務器端優化。

像這樣的事情應該工作,當然沒有樣機,因爲我從來沒有用過的原型,但在這裏它是沒有它:

thecount = 0;  
    function class1() { 
     $.ajax({ 
      type: "POST", 
      url: "/TestContoller/ActionOne", 
      success: function (result) { 
       $('#DivActionOne').html(result);      
       thecount++1;      
       if (thecount < 5) { class1(); }      
      }, 
      traditional: true, 
      error: function (req, status, error) { 
      } 
     });    
    } 
+0

感謝您的回覆。我試試上述解決方案,並讓你知道。我可能會很有用,如果你可以說通常可以做什麼樣的服務器優化。 –

+0

這可以解決內存泄漏問題。請讓我知道爲什麼應用程序服務器與數據庫服務器斷開連接? –

+0

對不起,但我不明白你在問什麼。服務器優化可以有很多事情,例如優化代碼,優化數據庫?或者增加更多內存等等。 –