2012-07-20 6 views
6

asp.net MVCコントロールがjquery $ .ajax関数によって呼び出されたときに、非常に不思議な問題が発生しました。このコントロールは403msかかるデータベースアクションを実行しますが、合計$ .ajaxコールはFirebugによると3400msです。これはかなりのオーバーヘッドです。私はパフォーマンスを最適化する必要がありますが、このオーバーヘッドはどこから来ているのか分かりません。

ここにコードがあります。データベースコールが削除されたときに私のコントローラで が、私は私のJS

function SearchIncidentReports() { 

    //pack the searchCriteria object here 
    var searchCriteria = ... 

    var start = new Date().getTime(); 

    $.ajax({ 
     contentType: 'application/json, charset=utf-8', 
     type: "POST", 
     url: myController/SetSearchResults, 
     data: JSON.stringify({ searchCriteria: searchCriteria }), 
     cache: false, 
     dataType: "json", 

     success: function (response) { 

      var got_data = new Date().getTime(); 
      var diff1 = got_data - start; 
      alert("data loaded in: " + diff1 + " ms"); 

      // do whatever you need with the data here. 
      // diff1 = 3400ms which is what Firebug shows too 

     }, 

     error: function (xhr, ajaxOptions, thrownError) { 
      var result = $.parseJSON(xhr.responseText); 
      alert(result.ErrorMessage); 
     } 

    }); 
    return false; 
} 

別のノートに

public JsonResult SetSearchResults(Criteria searchCriteria) 
{ 

     SearchResult myReportsResult = _repository.GetResults(searchCriteria);  

     //the statement above takes 403 ms 

     return Json(myReportsResult); 
    } 





public SearchResult GetResults(SearchCriteria searchCriteria) 
    { 
     SearchResult result = SearchResult(); 

     DataTable dbResults = _da.GetDBResults(searchCriteria);  


     List<IncidentReportHeader> irs = new List<IncidentReportHeader>();    

     for (int i = 0; i < dbResults.Rows.Count; i++) 
     { 
      IncidentReportHeader ir = new IncidentReportHeader(); 

      //populate all the properties of the ir object here,     

      irs.Add(ir); 
     } 

     result.Reports = irs;  
     return result;   
} 

    //models 
    public class SearchResult 
    { 

     private List<IncidentReportHeader> _res; 
     private int _numOfPages=0; 
     private int _recordsPerPage=0; 

     public List<IncidentReportHeader> Reports { 
      get { return _res; } 
      set 
      { 
       _res = value;    
      }   
     }   


     public SearchResult() 
     { 
      _res = new List<IncidentReportHeader>(); 
     } 
    } 
} 




//db call 
    public DataTable GetDBResults(SearchCriteria searchCriteria) 
     { 
     //add all params to the db object needed for the stored procedure here 



      DataTable dt = _db.ExecuteStoredProc("myDB.PACKAGE_NAME.stored_proc", 2000, ref _spParams, ref _spResultVariables); 
      return dt; 

} 

を持っていると私は手動でオブジェクトを移入、パフォーマンスは超高速です。

340msから3400msへの移行は間違っており、明らかに不当なオーバーヘッドがあるようです。ここで間違っていることを指摘できますか?それはかなり裸の骨だと私は本当にデータベースに行くことを避けることはできません。

JsonResultではなく空のセット(ActionResult)を返すようにしましたが、同じ問題がありました。

このasp.net MVCの問題ですか?事前

で おかげで、私もその中のExcelファイルとまったく同じデータベース操作を戻す作用を有する

を追加するように編集します。ファイルは410msで戻ってきますが、$ .ajax関数を使用していません。 $ .ajaxは何とか遅延を引き起こしているようです。私が必要とするのはデータベースからデータを取得することだけです。通常は非常に高速です。

誰かが尋ねたので、コントローラコードの内側を追加しましたが、内部(コントローラコールの合計内部)には403 msかかることを繰り返します。明らかに、問題はサーバーまたはデータベース呼び出しではありません。それはクライアントとサーバーの間にあると私には思われます。どんな助け?

誰でも私を助けることを決めた場合 1)Firebugでは、Action GetResultsを使用してPOSTに要した合計時間は3.54秒です。 2)FirebugのNet-> Allに移動すると、リクエストの内訳が表示されますが、最も長い時間が待たされています(3.5秒)。

サーバーとクライアントの間で通信するには3.5s - 403msの時間がかかりますが、その理由とその理由は?

+0

どのような量のデータがSetSearchResultsに返されますか?これは帯域幅の問題でしょうか? –

+0

私は空のセット(ActionResult)を返すことによって何を意味するのか分かりません。あなたは{}に戻り、それでも4300msかかったのですか?私はFirebugの人ではなく、MSアプリケーションでMSデバッガを使用する方が好きですが、返された "応答"を検査できるはずです。 –

+0

データベースにプロファイラを配置して、どのような呼び出しが行われているか、どのくらいの時間がかかるかを確認しましたか?その多くのパラメータでは、検索sprocは獣である可能性があります。 –

答えて

1

問題が見つかり、データベース呼び出しで問題が見つかりました。しかし、私が最初に間違っていたのは、時差を計算するコードです。

DateTime start = DateTime.Now; 

SearchResult myReportsResult = _repository.GetResults(searchCriteria); 


DateTime got_it = DateTime.Now; 
TimeSpan diff = (got_it - start); 
int diff_ms = diff.Milliseconds; 

このコードでは、正確なミリ秒値がわかりませんでした。

+2

'System.Diagnostics 'を使いやすくなります。代わりに「ストップウォッチ」を使用して時間の使用量を計算します。 – Amry

+0

あなたのソリューションはまさに何でしたか?私は私のページの一つで同じ問題に直面しています。他のすべてはajaxを介して高速に読み込まれ、ただ1つは '待機中'のゾーンでもっと多くの時間を費やしています..データベース呼び出しとデータ量は他のページでsimularです... – Brainfeeder

関連する問題