gpt4 book ai didi

c# - MySQL ExecuteNonQuery 花费太长时间

转载 作者:行者123 更新时间:2023-11-29 13:47:50 28 4
gpt4 key购买 nike

也许这不是我写过的最好的源代码,但它是一个简单的表单,其目标是远程写入数据。我有两个 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 来减少处理的数据量。

关于c# - MySQL ExecuteNonQuery 花费太长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17153562/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com