我的程序有一个奇怪的例外,所以我试图复制它来向你们展示,所以我做的是创建一个id(int-11 primary),title(varchar-255)并生成100k的表随机标题有40个字符lenght,当我运行我的方法读取每个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;
}
}
}
}
导致这种情况的原因是什么?任何线索?
答案 0 :(得分:1)
所以最后我的解决方法是增加net_read_timeout变量(我指出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;
}
}