さて、私のプログラムで奇妙な例外が発生したので、それを複製して皆さんにお見せしようとしました。そのため、id(int-11 primary)、title(varchar-255) を使用してテーブルを作成し、100k のランダムなタイトルを生成しました。 40 文字の長さです。各 ID のカウントを読み取るメソッドを実行すると、以下の例外チェックがスローされます。
私が見つけたのは、これがタイムアウトのためだったので、タイムアウトのためにこれを試しました.
- set net_write_timeout=99999; set 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;
}
}
}
}
何が原因でしょうか? 手がかりはありますか?