MySQL 异常 - 数据读取期间遇到致命错误
Posted
技术标签:
【中文标题】MySQL 异常 - 数据读取期间遇到致命错误【英文标题】:MySQL Exception - Fatal Error Encountered During Data Read 【发布时间】:2011-02-02 12:26:34 【问题描述】:我正在开发一个 C# 控制台程序,该程序从表中获取大量记录,通过医学石斑鱼运行它们,然后更新每条记录。它使用 mysql 连接器/NET 5.2.7。它的工作方式是我使用 SQL_BUFFER_RESULT 一次抓取数据块(即 20,000 行)以避免锁定。每条记录都通过分组器运行,然后对该记录进行单独的更新查询。使用了两个连接,一个读连接和一个写连接。
因此,当程序执行并遍历读取查询中的记录时,它使用 result.Read() 来执行此操作,其中 result 是 MySqlDataReader。 result.Read 调用是引发异常的地方。它随机发生(不在同一记录或任何东西上)。一旦在第一条记录上遇到它,它也会在数据读取器的每个后续读取调用中遇到。我已经尝试了很多事情,并搜索了其他人遇到的相关问题。任何见解都会很棒,请随时让我知道我需要提供哪些其他信息。
【问题讨论】:
抛出的异常是什么? 【参考方案1】:连接之间.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();
问题已解决:)
【讨论】:
这似乎对我也有帮助,但是是否有另一种/更好的方法来永久设置这些超时(在 Windows 安装上),而不是在每个connection.Open()
之后执行这样的命令?
这似乎也对我有用,很酷的是我在该死的连接字符串中正确设置了超时,这个垃圾连接器仍然不明白我想要它做什么.【参考方案2】:
我相信 .NET 连接器在读取大型数据集时存在缓冲区大小限制。我通过一次读取 5000 条记录解决了这个问题。
【讨论】:
我也是这样解决的。我将查询更改为 var sql = "SELECT * from object " + increase + " offset " + counter;然后每次都用增加的值增加计数器,然后不断循环直到它到达终点【参考方案3】:或者简单地说:
cmd.CommandTimeout = 99999;
【讨论】:
【参考方案4】:我在使用 .NET 连接器时遇到过类似的问题。该错误可能与速度有关 - C# 可能试图以比 MySQL 能够跟上的速度更快的速度处理数据。我最终做了两件事来补救 - 1. 在发生错误时(或在处理大部分之后)添加一个睡眠计时器,以便系统可以“呼吸”或 2. 尝试再次读取。
【讨论】:
以上是关于MySQL 异常 - 数据读取期间遇到致命错误的主要内容,如果未能解决你的问题,请参考以下文章
information_schema 查询期间 MySQL 致命错误(软件导致连接中止)