MySQL异常 - 在数据读取期间遇到致命错误。

11

我正在开发一款C#控制台程序,用于从一个表中获取大量记录,将它们通过医疗分组器处理后更新每条记录。它使用的是MySQL Connector/NET 5.2.7。它的工作原理是每次抓取一部分数据(例如20,000行),使用SQL_BUFFER_RESULT避免锁定。每个记录都会经过分组器处理,然后对该记录执行单独的更新查询。该程序使用两个连接,一个读连接和一个写连接。

因此,当程序执行并循环读取查询返回的记录时,它使用result.Read()方法来实现,其中result是MySqlDataReader类型的对象。在result.Read()调用时会抛出异常,并且这种情况是随机发生的(不是针对同一记录或任何其他明显规律)。一旦第一条记录遇到这个问题,数据读取器的每个后续读取调用都会遇到这个问题。我尝试了许多方法,并搜索了其他人遇到的相关问题。如果您有任何见解,请随时告诉我需要提供哪些其他信息。


抛出的异常是什么? - John M
4个回答

18

在 connection.Open(); 和 command.ExecuteNonQuery(); 之间,我添加了两行代码,如下所示:

connection.Open();

MySqlCommand cmd = new MySqlCommand("set net_write_timeout=99999; set net_read_timeout=99999", connection); // Setting tiimeout on mysqlServer
cmd.ExecuteNonQuery();

int numOfRecordsUpdated = command.ExecuteNonQuery();

问题已解决 :)


1
这似乎对我也有帮助,但是有没有另一种/更好的方法可以永久设置这些超时时间(在Windows安装中),而不是在每次connection.Open()之后执行这样的命令? - Christopher King
这对我也似乎起作用了,很酷的是我在该死的连接字符串中正确设置了所有超时时间,但这个垃圾连接器仍然不理解我想要它做什么。 - Felype

3
或者简单地说:
cmd.CommandTimeout = 99999;

1

我相信在读取大型数据集时,.NET连接器存在缓冲区大小的限制。我通过一次读取5000条记录来解决了这个问题。


我也是这样解决的。我将查询修改为 var sql = "SELECT * from object " + increase + " offset " + counter;然后每次使用增加值递增计数器,并循环执行,直到达到结束条件。 - WtFudgE

0

我曾经遇到过与.NET连接器类似的问题。错误可能与速度有关 - C# 可能试图比MySQL更快地处理数据。我最终采取了两种解决方法 - 1. 当出现错误(或在处理大部分后)时添加睡眠计时器,以便系统可以“呼吸”或2. 尝试重新读取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接