[英]MySQL ExecuteNonQuery takes too long
也许这不是我写过的最好的资料,但是它是针对以远程写入数据为目标的简单表单。 我有两个MySQLConnections都用于本地数据库。 localconnection用于读取数据库和updateconnection编辑每一行。 问题是,当我尝试更新数据库时,该程序引发超时并崩溃。 我认为问题是由while循环引起的 。 我的意图是读取一行,将其发布到服务器上,如果服务器返回的状态等于200,则对其进行更新。
这是代码,它在updateConnection.ExcecuteNonQuery();上失败。
// Local Database here.
localCommand.Parameters.Clear();
// 0 - Grab unsent emails
string receivedMessages = "SELECT * FROM EMAIL WHERE HASSENT = 0";
// Update connection init START
string updateConnectionString = "Server=" + this.localServer + ";Database=" + this.localDatabase + ";Uid=" + this.localUser + ";Pwd=" + this.localpassword;
MySqlConnection updateConnection = new MySqlConnection(updateConnectionString);
updateConnection.Open();
MySqlTransaction transaction = updateConnection.BeginTransaction();
MySqlCommand updateCommand = new MySqlCommand();
// Update connection init END
localCommand.Connection = localConnection;
localCommand.Prepare();
try
{
localCommand.CommandText = receivedMessages;
MySqlDataReader reader = localCommand.ExecuteReader();
while (reader.Read()) // Local db read
{
String EID = reader.GetString(0);
String message = reader.GetString(3);
String fromEmail = reader.GetString(6);
String toEmail= reader.GetString(12);
// 1 - Post Request via HttpWebRequest
var receivedResponse = JObject.Parse(toSend.setIsReceived(fromEmail, message, toEmail));
// 2 - Read the JSON response from the server
if ((int)receivedResponse["status"] == 200)
{
string updateInbox = "UPDATE EMAIL SET HASSENT = 1 WHERE EMAILID = @EID";
MySqlParameter EMAILID = new MySqlParameter("@EID", MySqlDbType.String);
EMAILID.Value = EID; // We use the same fetched above
updateCommand.Connection = updateConnection;
updateCommand.Parameters.Add(IID_value);
updateCommand.Prepare();
updateCommand.CommandText = updateInbox;
updateCommand.ExecuteNonQuery();
}
else
{
// Notice the error....
}
}
}
catch (MySqlException ex)
{
transaction.Rollback();
// Notice...
}
finally
{
updateConnection.Close();
}
如果不做一些实验,就很难确切地说出问题所在。
但是,有两种可能性。
首先,您的程序似乎正在Web服务器上运行,这必然限制了它在有限的时间内运行。 但是,您遍历了一个可能很大的结果集,并对该结果集中的每个项目进行了持续时间无法控制的工作。
其次,您从MySQL服务器逐行读取结果集,并使用不同的连接尝试更新该结果集后面的表。 这可能会导致死锁,在该死锁中,MySQL服务器将阻止您的更新查询之一,直到选择查询完成,从而阻止选择查询完成。
怎么治呢? 首先,尝试在每次调用此代码时处理固定的少量行。 将您的选择查询更改为
SELECT * FROM EMAIL WHERE HASSENT = 0 LIMIT 10
您每次将处理十条记录。
其次,从选择查询中读取整个结果集,并将其读入数据结构,然后遍历各项。 换句话说,不要在选择中嵌套更新。
第三,通过将SELECT *
更改为SELECT field, field, field
来减少处理的数据量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.