Délai de connexion sur requête sur une grande table
J'ai un problème avec un script d'expirer lors de l'extraction des données de forme d'une requête sur une grande table.
La table ont 9,521,457 lignes.
La requête que je suis en train de préformation est:
SELECT *
FROM `dialhistory`
WHERE `customerId` IN (22606536, 22707251, 41598836);
Cette requête s'exécute sans problèmes sur HeidiSQL et prendre environ 171 secondes et retourne 434 lignes.
Mais quand je lance mon C# script, dose, délai d'attente 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();
}
source d'informationauteur Androme
Vous devez vous connecter pour publier un commentaire.
Si vous en savez plus exactement que le nombre d'insérer, de le faire. Si vous le réglez à
int.MaxValue
vous êtes en train de supprimer une barrière de sécurité.Définir la CommandTimeout sur l'objet de commande
Ajouter un index sur la
customerId
colonne.La plus grande valeur pour une commande MySQL délai d'attente est la plus grande valeur d'un entier de 32 bits, en millisecondes, de 2 147 483 647. Mais en C# la propriété CommandTimeout est en secondes, pas millisecondes, donc plus élevé que 2147483 une exception.
Bien que ce n'est pas infinie, elle est de 24 jours, 20 heures, 31 minutes et 23 secondes, qui devrait répondre à votre besoin.
Paramètre la valeur 0 ne fonctionne pas pour moi. La propriété CommandTimeout ne serait pas conserver la valeur de 0 et la fonction auto-changer à nouveau de 30.
Réglage de la valeur de -1 n'a l'air de fonctionner, mais je n'ai pas testé suffisamment pour être certain qu'un délai d'attente ne devrait jamais se produire.
Option la plus sûre: aller avec 2147483.