超时已过期 - 会话 - 如何修复

时间:2014-07-15 19:37:22

标签: c# sql

大家好,提前谢谢。我试图修复一个将信息插入数据库表的方法。目前它正在经历超时,因为它在一个while循环中运行,这需要花费太长时间来处理所有内容。虽然我知道我可以增加命令超时,但我认为这不能解决问题,因为我认为它是代码。但我不确定正确的解决办法是什么。我可以访问Dapper,我想知道是否更有效地创建一个传递必要变量的方法,并为该组执行一个简单的快速语句然后去获取下一个?或者只是以不同的方式延续下面的内容?我应该将其移出代码并移到服务器上以获得更好的性能吗?

更新完整错误消息:

  

类型的异常' System.Web.HttpUnhandledException'扔了。
  文件:c:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files \ 6caa4c91 \ 19b853c6 \ App_Web_o3102kpb.9.cs
  方法:ProcessRequest行号:0
  内部例外:{超时已过期。操作完成之前经过的超时时间或服务器没有响应   文件:z:\ inetpub \ wwwroot \ SessionTransfer.aspx.cs
  方法:AddSessionToDatabase行号:94
  超时已过期。操作完成之前经过的超时时间或服务器没有响应   文件:z:\ inetpub \ wwwroot \ SessionTransfer.aspx.cs方法:Page_Load行号:33}

以下是原始代码:

      SqlConnection con = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand();
        con.Open();
        cmd.Connection = con;
        int i = 0;
        string strSql, guid = GetGuid();

        string temp = "";

        while (i < Session.Contents.Count)
        {
            if (Session.Contents[i] == null)
                temp = "";
            else {
                if ((Session.Contents[i].ToString().Trim().Length) > 0)
                    temp = Session.Contents[i].ToString().Replace("'", "''");
                else
                   temp = "";
            }

            strSql = "INSERT INTO SessionTable (GUID, SessionKey, SessionValue) " + 
                     "VALUES ('" + guid + "', '" + Session.Contents.Keys[i].ToString() + "', '" + temp + "')";
            cmd.CommandText = strSql;
            cmd.ExecuteNonQuery(); 
            i++;
        }

        con.Close();
        cmd.Dispose();
        con.Dispose();

        return guid;

更新 - 最终解决方案:

      var SessionList = new List<Session>();
        while (i < Session.Contents.Count)
        {
            string temp = "";
            if (Session.Contents[i] == null)
                temp = "";
            else
            {
                temp = (Session.Contents[i].ToString().Trim().Length) > 0 ? Session.Contents[i].ToString().Replace("'", "''") : "";
            }
            var s = new Session
            {
                TempGuid = guidTemp,
                Contents = Session.Contents[i] != null ? Session.Contents[i].ToString() : null,
                Temp = temp
            };
            SessionList.Add(s);

            i++;
        }
        mySession = SerializationUtilities.SerializeObjectToXML(SessionList);

        using (var con = new SqlConnection()) 
        {
            con.ExecuteHGW("Transfer", new { mySession }, commandType: CommandType.StoredProcedure);
        }

然后在SQL方面,我只是将XML放在一个表中并对表执行一个单独的插入语句,时间得到显着改善。

1 个答案:

答案 0 :(得分:0)

我想建议你2个改进:

  1. 在循环中,您将逐个对db执行insert语句。打开与db的连接然后发送查询,执行它并返回结果需要很长时间。批量处理要好得多。因此,收集10,000个这样的插入语句,使用StringBuilder构建整个实例并一次性对db执行它。这将真正提高您的应用程序的速度。一批中的插入指令数量,您应该根据系统测试自行选择。
  2. 如果申请1)提示仍然出现超时问题,我会建议2种可能的解决方案:

    A)。不要一次性将所有要处理的元素都发送到Web服务,而是像以前一样批处理它们(应用第二个批处理)。因此,例如发送给Web服务50,000个元素,然后等待Web服务的确认,然后继续下一批。最大的好处是,您可以向用户轻松显示进度条,显示当前的操作状态。

    B)。一次发送要对db处理的所有项目,但不要等待结果。在您的应用程序中,只显示项目已处理,并且每个10秒发送到Web服务请求以询问作业是否已完成。完成后向用户发出信号。