asp.net MVC コントロールが jquery $.ajax 関数によって呼び出されると、パフォーマンスが低下するという非常に興味深い問題に遭遇しました。コントロールは 403 ミリ秒かかるデータベース アクションを実行しますが、Firebug によると $.ajax 呼び出しの合計は 3400 ミリ秒であり、かなりのオーバーヘッドが追加されています。パフォーマンスを最適化する必要がありますが、このオーバーヘッドがどこから発生するのかわかりません。
これがコードです。私のコントローラーには、
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;
}
私の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;
}
データベース呼び出しが削除され、オブジェクトを手動で設定すると、パフォーマンスが非常に高速になります。
403 ミリ秒から 3400 ミリ秒にするのは明らかに間違っており、明らかに不当なオーバーヘッドがあるようです。ここで何が間違っているのか指摘してもらえますか? それはかなり骨の折れるものであり、データベースに行くことを避けることはできません。
コントロールに JsonResult ではなく空のセット (ActionResult) を返させようとしましたが、同じ問題がありました。
これはasp.net MVCの問題ですか?
アップデート
また、Excel ファイルを返すアクションと、その中にあるまったく同じデータベース操作もあります。ファイルは関数を使用せずに 410ms で戻ってき$.ajax
ます。$.ajax
どういうわけか遅延を引き起こしているようです。必要なのはデータベースからデータを取得することだけで、通常は非常に高速です。
誰かがそれを求めたので、コントローラーコードの内部を追加しましたが、内部 (はい、コントローラー呼び出しの内部の合計) は 403 ミリ秒かかることを繰り返します。明らかに、問題はサーバーやデータベースの呼び出しではありません。クライアントとサーバーの間にあるようです。
ノート:
- Firebug では、Action GetResults を使用して POST にかかった合計時間は 3.54 秒です。
- Firebug で Net->All に移動すると、要求の内訳が一覧表示され、待機に最も長い時間 (3.5 秒) が費やされていることがわかります。
サーバーとクライアント間の通信に 3.5 秒から 403 ミリ秒の時間が費やされているようですが、どこで、なぜですか?