Verbindungs-timeout für Abfrage am großen Tisch
Ich habe ein problem mit einem Skript-Timeout beim abrufen von Daten Formular eine Abfrage auf den großen Tisch.
Dem Tisch haben 9,521,457 Zeilen.
Die Abfrage, die ich versuche zu preform:
SELECT *
FROM `dialhistory`
WHERE `customerId` IN (22606536, 22707251, 41598836);
Diese Abfrage läuft ohne Probleme auf HeidiSQL und etwa 171 Sekunden und zurück 434 Zeilen.
Aber wenn ich mein C# script Dosis timeout nach 161 Zeilen.
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.
Hier ist der 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();
}
InformationsquelleAutor Androme | 2010-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du mehr wissen genau, welche Nummer zu legen, tun Sie das. Wenn du es auf
int.MaxValue
entfernen Sie eine Sicherheits-Barriere.InformationsquelleAutor
Legen Sie die CommandTimeout auf das command-Objekt
Ihre Datenbank kann ein timeout definiert, wenn Sie den timeout mit commandTimeout dies kann überschrieben werden, durch die Konfiguration der Datenbank. In meinem Fall hat es bei mir geklappt, aber in deinem Fall könnte es ein Problem sein, müssen Sie an die Arbeit mit dem DBA.. (für zukünftige Leser.. offensichtlich Ihr Problem war Jahre her, sorry)
InformationsquelleAutor
Fügen Sie einen index auf die
customerId
Spalte.Ich weiß nicht, wie es kann möglicherweise 171 Sekunden zurück 434 Zeilen dann. Sind Sie auf der Rückkehr einige extrem große Daten (z.B. BLOBs) Und
CustomerId
kann nicht der PK auf seine eigenen sowieso, wenn 3 customerids Rückkehr 434 Zeilen. Was sind die anderen Spalten in den index und was ist die Reihenfolge dieser Spalten in der composite-index?Meinst du das war der primäre Schlüssel für eine andere Tabelle? Wenn Sie den Primärschlüssel für diese Tabelle, dann sollten Sie nicht bekommen, 434 zurückgegebenen Zeilen aus der Abfrage.
InformationsquelleAutor
Dem größten Wert für eine MySQL Kommando timeout wird der größte Wert für ein 32-bit-Ganzzahl, in Millisekunden, 2147483647. Aber in C# die CommandTimeout-Eigenschaft ist in Sekunden nicht Millisekunden, also höher als 2147483 zu einer Ausnahme führen.
Dies ist zwar nicht unendlich, Sie ist 24 Tagen, 20 Stunden, 31 Minuten und 23 Sekunden, das hoffentlich Ihren Bedarf zu erfüllen.
Einstellung der Wert 0 hat bei mir nicht funktioniert. Die CommandTimeout-Eigenschaft behält nicht den Wert 0 gehalten und auto-Wechsel zum 30.
Einstellung den Wert -1 hat, scheinen zu funktionieren, aber ich habe nicht testen Sie es genug, um sicher zu sein, dass ein timeout würde nie auftreten.
Sicherste Möglichkeit: gehen Sie mit 2147483.
InformationsquelleAutor