好吧,我的程序有一个奇怪的异常,所以我试图复制它给你们看,所以我所做的是创建一个带有 id(int-11 primary)、title(varchar-255) 的表并生成 100k 个随机标题40 个字符长度,当我运行读取每个 id 计数的方法时,它会在下面抛出异常检查以获取更多信息。
我发现这是因为超时所以我尝试了这个超时。
- 设置 net_write_timeout=99999;设置 net_read_timeout=99999;
- 在连接上尝试 pooling=true
- 试过 cmd.timeout = 120;
我还尝试添加我玩过多个值的 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;
}
}
}
}
这可能是什么原因造成的?任何线索?