1

私は、クエリ文字列の形式でデータを受信し、必要に応じて分離し、このデータをデータベースに保存することを唯一の目的とする 1 つの Web ページを含む Asp.Net Web サイトを持っています。

このデータは、複数の車両追跡システムから取得されます。各車両は、データの文字列をクエリ文字列として 30 秒ごとに送信します。

Web ページにアクセスすると、ページの読み込み時にクエリ文字列を読み取り、データベースに挿入操作を行うように、Web ページにコードを記述しました。このようなもの-

protected void Page_Load(object sender, EventArgs e)
{
    con.Open();
    string input = Request.QueryString["vinput"];
    var m = Regex.Match(input, @"~(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@");
    if (m.Success)
    {
        string[] vals = new string[20];
        int j = 1;
        for (int i = 0; i < 20; i++)
        {
            vals[i] = m.Groups[j].Value;
            j++;
        }
        cmd.CommandText = "insert into tracking (vehicle_no,hardware_id,lat,lng,speed,direction,an0,an1,an2,an3,di0,di1,di2,di3,do0,do1,do2,do3,tdate,ttime) values('" + vals[0] + "','" + vals[1] + "','" + vals[2] + "','" + vals[3] + "','" + vals[4] + "','" + vals[5] + "','" + vals[6] + "','" + vals[7] + "','" + vals[8] + "','" + vals[9] + "','" + vals[10] + "','" + vals[11] + "','" + vals[12] + "','" + vals[13] + "','" + vals[14] + "','" + vals[15] + "','" + vals[16] + "','" + vals[17] + "','" + vals[18] + "','" + vals[19] + "')";
        cmd.Connection = con;
        cmd.ExecuteNonQuery();
    }
}

車両追跡システムの代わりにこのサイトをテストするためのシミュレーター アプリを作成しました。このサイトは、1 つから 3 つのシミュレーター インスタンスからのデータがある場合は正常に動作しますが、3 つ以上のシミュレーター インスタンスが同時にデータを送信すると (およそ)、データをデータベースに保存できません。

たとえば、5 つのレコードをシミュレーターから一度に 1 つずつ送信し、そのような 6 つのシミュレーター インスタンスがページにデータを送信しています。データベースの最後に、30 レコードではなく 15 レコードしか挿入されていません。ところで、この Web サイトはIIS 5.1で実行されます。

この問題にどう対処すればよいですか? 提案してください。


更新: 最後に問題が見つかりました。多くのグーグル検索の後、このリンクこれが見つかりました。Windows XP IIS では、ベーシック/スターターのリクエスト制限が 3 のみであるため、サーバーに依存します。

4

2 に答える 2

1

ハンドラーのような軽量のものを使用できる場合は、ページを使用しても意味がありません。いくつかのことを切り替えることができますが、これは重い操作ではありません。これを行うには、1つの例外を除いて非常に最適な方法があります。これは、文字列から挿入ステートメントを生成するのではなく、ストアドプロシージャを作成することです。

public class htest : System.Web.IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {
        System.Web.HttpRequest Request = context.Request;
        Match m = Regex.Match(Request.QueryString["vinput"], @"~(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@(.+)@");
        if (m.Success)
        {
            using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection())
            {
                try
                {
                    con.Open();
                    System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("command", con);
                    string[] vals = new string[20];
                    int j = 1;
                    for (int i = 0; i < 20; i++)
                    {
                        vals[i] = m.Groups[j].Value;
                        j++;
                    }
                    cmd.CommandText = "insert into tracking (vehicle_no,hardware_id,lat,lng,speed,direction,an0,an1,an2,an3,di0,di1,di2,di3,do0,do1,do2,do3,tdate,ttime) values('" + vals[0] + "','" + vals[1] + "','" + vals[2] + "','" + vals[3] + "','" + vals[4] + "','" + vals[5] + "','" + vals[6] + "','" + vals[7] + "','" + vals[8] + "','" + vals[9] + "','" + vals[10] + "','" + vals[11] + "','" + vals[12] + "','" + vals[13] + "','" + vals[14] + "','" + vals[15] + "','" + vals[16] + "','" + vals[17] + "','" + vals[18] + "','" + vals[19] + "')";
                    cmd.Connection = con;
                    cmd.ExecuteNonQuery();
                }
                catch
                {
                   //At least do some type of logging in this event.
                }
                finally
                {
                    con.Close();
                }
            }
        }
        context.Response.ContentType = "text/plain";
        context.Response.Write("Success");
    }
}

明らかに、いくつかのブール値を使用して、最後にクライアントに書き戻す内容を決定できます。

于 2012-10-01T06:36:49.067 に答える
0

いくつかの提案..

接続を開いています。下部も閉じてください。cmd オブジェクトも破棄します。

INSERT ステートメントを SQL トランザクションに入れる

try と Catch を使用します (Catch 句を使用して、エラー メッセージを Database に格納します。ex.message はエラーの詳細を返します。)

于 2012-10-01T06:31:42.447 に答える