0
function InitializeCharts() {
 for (var i = 0; i < arguments.length; i++) {
     compName = arguments[i];
     $.ajax({
         async:true,
         timeout: 60000,
         dataType: "json",
         url: "/SalesDashboard/GetChartData",
         data: { company: compName, from: startDate, to: endDate },
         success: (function () {
             var cmp = compName;
             return function (data) {
                 ChartData[cmp] = data;
                 PrepareChart(data, cmp);
             };
         })(),
         error: function (xhr, ajaxOptions, thrownError) {
             console.log(xhr.status+': '+xhr.statusText);                
             console.log(thrownError);
         }
     });
 }
}

クライアント側で上記の関数を使用して、AJAX リクエストを作成し、データを取得しています。次のように関数を呼び出すと、正常に動作します。

InitializeCharts("ABC"); // A Single parameter

単一のリクエストに対しては正常に機能しますが、以下のように複数のパラメーターを渡すと、複数の同時リクエストが作成され、「Internal Server Error -500」エラーが発生します。

InitializeCharts("ABC", "BBC", "CCC", "DDD", "EEE", "ACD", "CBD", "CDS", "ADB"); // Multiple parameters

いくつかのランダムな会社、時には2つ、時には3つまたは4つのエラーが表示されます。AJAX リクエストのタイムアウトを 60000 に増やしてみましたが、うまくいきませんでした。また、IIS サーバーを調べて、接続タイムアウトを 3 分に増やしましたが、それでも同じ応答が得られました。データをクライアントに戻すのに 1 分もかからないことはわかっています。ajax リクエストの「async 」値を false に設定すると、機能しますが、すべての企業のデータが返されるまで UI がブロックされます。

以下は私のサーバー側のコードです:

static int hitCount = 0;
private string ConnectionString = "server=localhost;database={0};uid=test;password=test;pooling=false;";

private string QueryString_Daily = "SELECT Day(mergefiledate) AS `Date`, COUNT(order_no) AS `Count` FROM orders_new WHERE DATE(mergefiledate)>='{0}' and Date(mergefiledate)<='{1}' GROUP BY DATE(mergefiledate);";

public Task<string> GetChartData(string company, string from, string to)
    {
        hitCount++;
        return Task.Factory.StartNew(() => GetData(company, from, to));
    }

private string GetData(string company, string from, string to)
    {            
         string QuerySTR = string.Empty;
         QuerySTR = string.Format(QueryString_Daily, startDt.ToString("yyyy-MM-dd"), endDt.ToString("yyyy-MM-dd"));
         MySqlConnection mycon = new MySqlConnection(string.Format(ConnectionString, company));
        MySqlCommand cmd = new MySqlCommand(QuerySTR, mycon);
        cmd.CommandTimeout = 0;
        DataTable dt = new DataTable();
        try
        {
            mycon.Open();
        }
        catch (Exception ex)
        {
            Response.Write("<script>alert('Database connection error, please try again. ERROR_DETAILS: '" + ex.Message + "');</script>");
            return null;
        }

        if (mycon.State == ConnectionState.Open)
        {

            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            da.Fill(dt);

        }

        if (mycon.State == ConnectionState.Open)
        {
            try
            {
                mycon.Close();
            }
            catch { }
        }

        if (dt.Rows.Count > 0)
        {
    var result = Newtonsoft.Json.JsonConvert.SerializeObject(dt);
             return result;
     }
    else
     {
            return null;
         }

    }

私はグーグルで解決策を見つけようとしてきましたが、stackoverflow.comを掘り下げました...などですが、まだ運がありません。助けていただければ幸いです。よろしくお願いします。

4

1 に答える 1

2

皆様、ご尽力いただき、誠にありがとうございました。私は解決策を得ました。以下のステートメントを使用してコマンドタイムアウトを無限に設定したという印象を受けましたが、実際には間違っていました。

cmd.CommandTimeout = 0;

タイムアウトを次のように変更しました。

cmd.CommandTimeout = 600;

そしてそれは完璧に機能しました。少しずつ助けてくれてありがとう。

于 2013-07-30T08:58:32.090 に答える