Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MySqlDataReader在大约4分钟后停止读取并返回_C#_Sql_Mysql - Fatal编程技术网

C# MySqlDataReader在大约4分钟后停止读取并返回

C# MySqlDataReader在大约4分钟后停止读取并返回,c#,sql,mysql,C#,Sql,Mysql,我有一个简单的查询,返回25026行: MySqlCommand cmd = new MySqlCommand("SELECT ID FROM People", DB); MySqlDataReader reader = cmd.ExecuteReader(); (ID是一个int)如果我这样做: int i = 0; while (reader.Read()) i++; i将等于25026。但是,我需要对循环中的每个ID进行一些处理;每一次迭代都会花费数百毫秒的时间 int i = 0;

我有一个简单的查询,返回25026行:

MySqlCommand cmd = new MySqlCommand("SELECT ID FROM People", DB);
MySqlDataReader reader = cmd.ExecuteReader();
ID
是一个
int
)如果我这样做:

int i = 0;
while (reader.Read()) i++;
i
将等于25026。但是,我需要对循环中的每个ID进行一些处理;每一次迭代都会花费数百毫秒的时间

int i = 0;
MySqlCommand updater = new MySqlCommand("INSERT INTO OtherTable (...)", anotherConnection);
updater.Prepare();
while (reader.Read()) {
     int id = reader.getInt32(0);
     // do stuff, then
     updater.ExecuteNonQuery();
     i++;
}
但是,在大约4:15的处理之后,
reader.Read()
只返回false。在我的大多数测试运行中,
i
等于14896,但有时也会停在11920。同样数量的记录之后退出的
DataReader
是可疑的,而且它在不同数量的行之后停止的次数似乎更奇怪

当肯定有更多行时,
reader.Read()
为什么返回false?没有抛出异常,甚至没有第一次抛出的异常


更新:我在回复中提到,我确信
MySqlDataReader.Read()
正在接受一个异常,因此我下载了(
branch-lp:connectornet/6.2 C:/local/path
)并将该项目添加到我的解决方案中。果然,经过6:15的处理,出现异常

调用
会抛出一个
MySqlException
,并显示一条消息“读取流失败”。
InnerException
是一个
SocketException

{ Message: "An existing connection was forcibly closed by the remote host",
  ErrorCode: 10054,
  SocketErrorCode: ConnectionReset }
10054表示TCP套接字被一个
RST
而不是正常的断开握手(
FIN
FIN ACK
ACK
)中止,这告诉我网络连接有问题

在my.ini中,我将
interactive\u timeout
wait\u timeout
调到1814400(秒),但没有用

所以。。。为什么我的连接在读了6:15(375秒)后被中断


(还有,为什么在我使用官方二进制文件时,这个异常会被吞没?它看起来应该出现在我的应用程序代码中。)

尝试设置更长的连接超时。

可能是服务器端的超时?

尝试在MySqlCommand上设置超时,而不是在“cmd”和“updater”上设置MySqlConnection。 如果这样做会发生什么:
从人物中选择前100个ID

试试这个 1.添加参考系统。事务处理

using(TransactionScope scope = new TransactionScope())
{
       //Initialize connection
       // execute command
     :
     :
     scope.Complete();
}

在作用域的using中编写整个插入/更新逻辑。这肯定会对您有所帮助。

在创建命令后添加以下内容

cmd.CommandTimeout = 0;
这会将CommandTimeout设置为不确定。获得超时的原因可能是因为连接虽然已执行,但由于读卡器的原因仍处于“命令”阶段

尝试将CommandTimeout设置为0,或者先读取所有内容,然后对结果执行后续函数。否则,我唯一可能看到的另一个问题是,由于服务器本身超时,Sql Server正在删除针对指定进程id的结果集。

我在这里找到了一篇文章

这家伙所经历的是类似的:在完全相同的时刻,在阅读同一张唱片的过程中(我猜这和你所经历的是一样的)挂起Read方法。 在他的例子中,他在Read()循环期间调用了另一个webservice,该webservice超时,导致Read()无异常挂起

在您的机器上,Read()循环中的更新超时(我认为更新使用默认的30秒超时)并导致相同的效果,这会是相同的吗


也许是一个长镜头,但读这两个故事听起来很像家人。

也许你的桌子坏了-这家伙的问题听起来和你的问题很相似: -修理一下桌子,看看会发生什么

如果不起作用,请继续阅读:

我猜你正陷入某种僵局,尤其是考虑到你正在阅读和写作。这可以解释为什么它在简单循环中工作,但在进行更新时不工作。它还可以解释为什么每次都发生在同一行/同一时间

SqlDataReader中有一个奇怪的bug,它消除了异常()。MySqlDatareader中可能有类似的内容-在最后一次.Read()调用之后,尝试调用.NextResult()。即使不是死锁,也可能有助于诊断问题。在这种情况下,您希望更倾向于“信任但验证”-是的,文档中说会在timeone上抛出和异常,但有时(很少)该文档存在:)对于第三方供应商来说尤其如此-例如,请参阅-mysql.net库遇到了一些问题,就像您过去遇到的问题一样

另一个想法是观察数据库中发生的事情——确保数据不断地被提取,直到代码所在的行退出

如果做不到这一点,我只需要读取所有数据,缓存它,然后进行修改。通过批处理修改,代码将不那么健谈,执行速度更快

或者,每隔1000行左右重置读卡器(并跟踪您的行ID)


希望这里的东西能帮助你克服挫折

因为我只是在读
int
s,所以我最终只是将整个结果集读入
列表,关闭阅读器,然后进行处理。这对于
int
s来说是很好的,因为即使一百万占用<100 MB的RAM,但我仍然对根本问题没有得到解决感到失望–如果我每行读取的
int
多于一个,对于大型数据集,内存将成为一个非常大的问题。

有两个问题会让事情变得更加混乱:

第一个问题,正如在另一篇文章中提到的,是MySQL.NET连接器的旧版本遇到了超时异常。我使用的是mysql.data.dll版本6.1.x,升级到6.3.6后,异常被正确抛出

第二个是默认的MySQL