C# MySqlDataAdapter.Fill()速度慢/失败
我目前使用C# MySqlDataAdapter.Fill()速度慢/失败,c#,mysql,datatable,dataadapter,C#,Mysql,Datatable,Dataadapter,我目前使用MySQL.Data扩展来将我的MySQL数据库信息加载到我的C#应用程序中。我使用MySqlDataAdapter.Fill()命令将数据加载到DataTable中 此解决方案适用于我的大多数表,但较大的表除外。例如,我有一个大约1310634行长的表。当我尝试用该数据填充DataTable时,应用程序将挂起并最终失败,出现异常: 异常无法从传输连接读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应 我已经尝试过一些解决方案,其中我
MySQL.Data
扩展来将我的MySQL数据库信息加载到我的C#应用程序中。我使用MySqlDataAdapter.Fill()
命令将数据加载到DataTable
中此解决方案适用于我的大多数表,但较大的表除外。例如,我有一个大约1310634行长的表。当我尝试用该数据填充
DataTable
时,应用程序将挂起并最终失败,出现异常:
异常无法从传输连接读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应
我已经尝试过一些解决方案,其中我使用如下命令来增加MySQL连接的超时时间set net\u write\u timeout=99999;设置网络读取超时=99999代码>,但似乎没有帮助
这是到目前为止我的C#代码:
//Construct output DataTable
DataTable output = new DataTable();
MySqlDataAdapter ad = new MySqlDataAdapter(query, connection);
try
{
ad.FillSchema(output, SchemaType.Mapped); //Filling Columns, Types, Limitations
ad.Fill(output); //Filling Data
ad.Dispose();
}
catch (Exception ex)
{ throw; }
return output;
正如上面的评论所述,解决您的问题的最佳解决方案是重构您的解决方案。使用一些SQL SELECT语句只获取完成手头任务所需的行,而不是从数据库中获取整个表
如果您真的需要处理整个表,例如,进行SQL无法完成的某种一致性检查,那么您可以分部分加载数据,一次只选择100K行
但是,我再次怀疑同时获取超过一百万行的多个表是否是一个有效的用例,因此不应该执行…一个明显的问题。。。您真的需要一次将超过一百万行加载到内存中吗?(另外,请注意,您的try/catch块完全是多余的。您可以通过删除它来简化代码。)这可能会对@David有所帮助。不幸的是,我正在处理一种数据同步类型的应用程序。有必要将所有内容都载入内存。我发现的奇怪的事情是,我只在运行Windows10的机器上出现超时错误(无论硬件是什么)。如果我在Windows Server 2012、Windows 7或Windows 8.1计算机上运行该应用程序,则该应用程序加载表时不会出现问题或延迟。。。。