我的程序有一个奇怪的例外,所以我试着复制它给你们看,所以我做的是用id(int-11主),title(varchar-255)创建一个表,并生成带有40个字符长度的100 k随机标题,当我运行我的方法读取每个id的计数时,它会在下面抛出一个异常检查以获得更多信息。
我发现,这是因为超时,所以我尝试了这个超时。
我还尝试添加MaxDegreeOfParallelism,我使用了多个值,但在一段时间后仍然会出现相同的错误。
我的例外:
无法终止查询,中止连接。异常无法从传输连接读取数据:连接尝试失败是因为连接方在一段时间后没有正确响应,或者已建立的连接由于连接主机未能响应而失败。
public static string db_main = "Server=" + server + ";Port=" + port + ";Database=" + database_main + ";Uid=" + user + ";Pwd=" + password + ";Pooling=true;";
private void button19_Click(object sender, EventArgs e)
{
List<string> list = db.read_string_list("SELECT id from tablename", db.db_main);
//new ParallelOptions { MaxDegreeOfParallelism = 3 },
Task.Factory.StartNew(() =>
{
Parallel.ForEach(list, id =>
{
string sql = "SELECT COUNT(*) FROM tablename where id=" + id;
var ti = db.read_int(sql, db.db_main);
Console.WriteLine(ti);
});
}).ContinueWith(_ =>
{
Console.WriteLine("Finished");
});
}
public static int? read_int(string sql, string sconn)
{
var rdr = MySqlHelper.ExecuteReader(db.db_main, sql);
if (rdr.HasRows)
{
rdr.Read();
return rdr.GetInt32(0);
}
else
return null;
}使用超时值选项读取int的替代方法.
public static int? read_int2(string sql, string sconn)
{
using (var conn = new MySqlConnection(sconn))
{
using (var cmd = new MySqlCommand(sql, conn))
{
//cmd.CommandTimeout = 120;
conn.Open();
using (var rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
rdr.Read();
return rdr.GetInt32(0);
}
else
return null;
}
}
}
}是什么导致了这一切?有什么线索吗?
发布于 2014-11-11 18:23:11
最后,我的解决方案是增加net_read_timeout变量(im指出net_write_timeout,因为在执行长查询时也会发生这种情况)。
运行这些查询*注意:在您重新启动您的PC后,默认值将再次发生。
set @@global.net_read_timeout = 999;
set @@global.net_write_timeout = 999;也可以将其添加到连接字符串中。
default command timeout=999;最后,我使用此方法读取这些值。
public static int? read_int(string sql, string sconn)
{
try
{
using (MySqlDataReader reader = MySqlHelper.ExecuteReader(sconn, sql))
{
if (reader.HasRows)
{
reader.Read();
return reader.GetInt32(0);
}
else
return null;
}
}
catch (MySqlException ex)
{
//Do your stuff here
throw ex;
}
}https://stackoverflow.com/questions/26717364
复制相似问题