大家好,提前谢谢。我试图修复一个将信息插入数据库表的方法。目前它正在经历超时,因为它在一个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放在一个表中并对表执行一个单独的插入语句,时间得到显着改善。
答案 0 :(得分:0)
我想建议你2个改进:
如果申请1)提示仍然出现超时问题,我会建议2种可能的解决方案:
A)。不要一次性将所有要处理的元素都发送到Web服务,而是像以前一样批处理它们(应用第二个批处理)。因此,例如发送给Web服务50,000个元素,然后等待Web服务的确认,然后继续下一批。最大的好处是,您可以向用户轻松显示进度条,显示当前的操作状态。
B)。一次发送要对db处理的所有项目,但不要等待结果。在您的应用程序中,只显示项目已处理,并且每个10秒发送到Web服务请求以询问作业是否已完成。完成后向用户发出信号。