ExecuteReader上出现Mysql异常
本文关键字:Mysql 异常 ExecuteReader | 更新日期: 2023-09-27 18:29:06
我的程序中出现了一个奇怪的异常,所以我试图复制它来向大家展示,所以我所做的是创建一个id为(int-11 primary)、title为(varchar-255)的表,并生成了长度为40个字符的100k个随机标题,当我运行读取每个id的计数的方法时,它会在下面抛出一个异常检查以了解更多信息。
我发现这是因为超时,所以我尝试了这个超时。
- 设置net_write_timeout=99999;设置net_read_timeout=99999
- 已尝试的池=连接时为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;
}
}
}
}
是什么原因造成的?有线索吗?
所以最后我的解决方案是增加net_read_timeout变量(我指出net_write_timeout,因为执行长查询时也会发生这种情况)
运行这些查询*注意:重新启动电脑后,将再次出现默认值。
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;
}
}