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の時間がかかりますが、その理由とその理由は?
どのような量のデータがSetSearchResultsに返されますか?これは帯域幅の問題でしょうか? –
私は空のセット(ActionResult)を返すことによって何を意味するのか分かりません。あなたは{}に戻り、それでも4300msかかったのですか?私はFirebugの人ではなく、MSアプリケーションでMSデバッガを使用する方が好きですが、返された "応答"を検査できるはずです。 –
データベースにプロファイラを配置して、どのような呼び出しが行われているか、どのくらいの時間がかかるかを確認しましたか?その多くのパラメータでは、検索sprocは獣である可能性があります。 –