J'ai un problème avec un script qui expire lors de l'extraction de données à partir d'une requête sur une grande table. Le tableau comprend 9 521 457 lignes.Délai d'expiration de la connexion sur requête sur une grande table
La requête que je suis en train de préforme est:
SELECT *
FROM `dialhistory`
WHERE `customerId` IN (22606536, 22707251, 41598836);
Cette requête fonctionne sans problème sur HeidiSQL et prendre environ 171 secondes, puis 434 lignes. Mais quand j'exécute mon script C#, dosez le délai après 161 lignes.
16:54:55: Row 1
...
16:54:55: Row 161
16:55:32: Error -> Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Voici le code
public MySqlDatabase(string server, string database, string username, string password)
{
ConnectionString = "SERVER=" + server + ";DATABASE=" + database + ";UID=" + username + ";PASSWORD=" + password + ";";
}
public IQueryable<DailHistory> GetHistory(IList<int> customerIds)
{
IList<DailHistory> list = new List<DailHistory>();
var connection = new MySqlConnection(ConnectionString);
connection.Open();
var command = connection.CreateCommand();
command.CommandText = "SELECT * FROM `dialhistory` WHERE `customerId` in ("+string.Join(",", customerIds.ToArray())+")";
var reader = command.ExecuteReader();
int i = 1;
while (reader.Read())
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + ": Row " + i);
i++;
try
{
var d = new DailHistory();
d.CustomerId = int.Parse((string) reader["customerId"]);
d.Agent = ParseNullAbleString(reader["agent"].ToString());
d.CallBackReason = ParseNullAbleString(reader["callBackReason"].ToString());
d.CallState = ParseCallSate(reader["callState"].ToString());
d.ContactResponse = ParseNullAbleString(reader["contactResponse"].ToString());
d.DailTime = new DailTime(reader["dialStart"].ToString(), reader["dialEnd"].ToString());
d.HistoryIndex = int.Parse(reader["historyIndex"].ToString());
d.Note = ParseNullAbleString(reader["note"].ToString());
d.OldDialNo = ParseNullAbleInt(reader["oldDialNo"].ToString());
d.ProjectJob = ParseNullAbleString(reader["projectJob"].ToString());
list.Add(d);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
reader.Close();
return list.AsQueryable();
}
command.CommandTimeout = 0; n'a pas fonctionné :(il a toujours expiré – Androme
@DoomStone Votre base de données peut avoir un délai d'attente défini, lorsque vous demandez le délai d'attente en utilisant commandTimeout, cela peut être annulé par la configuration de la base de données, dans mon cas cela a fonctionné pour moi un problème que vous avez besoin de travailler avec votre DBA .. (pour les futurs lecteurs .. évidemment votre problème était il ya des années désolé) – Chris