2010-11-30 1 views
9

У меня проблема с тайм-аутом сценария, в то время как выборка данных формирует запрос на большой таблице.Тайм-аут соединения по запросу на большой таблице

В таблице 9,521,457 строк.

Запрос Я пытаюсь Заготовку:

SELECT * 
FROM `dialhistory` 
WHERE `customerId` IN (22606536, 22707251, 41598836); 

Этот запрос работает без проблем на HeidiSQL и занимает около 171 секунд и возвращает 434 строк.

Но когда я запускаю свой сценарий на C#, это истекает после 161 строки.

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. 

Вот код

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(); 
} 

ответ

22
command.CommandTimeout = int.MaxValue; 

Если более точно, какой номер для вставки знать, что делать. Если вы установите его на int.MaxValue, вы удалите защитный барьер.

12

Установите CommandTimeout на объект команды

var command = connection.CreateCommand(); 
command.CommandTimeout = 0; 
//zero specifies never timeout. 
//Any number greater than zero is the number of seconds before 
//the command will time out. 
+0

command.CommandTimeout = 0; не работает :(он по-прежнему отключен – Androme 2010-11-30 16:20:59

+1

@DoomStone В вашей базе данных может быть установлен тайм-аут, когда вы запрашиваете таймаут с помощью команды commandTimeout, это может быть переопределено конфигурацией базы данных. В моем случае это сработало для меня, но в вашем случае это может быть проблема, с которой вам нужно работать с вашим DBA .. (для будущих читателей .. очевидно, ваша проблема была годами извините) – Chris 2013-12-18 19:50:09

2

Добавить индекс на столбец customerId.

0
command.CommandTimeout = 2147483; 

Наибольшее значение для времени ожидания команды MySQL является самым большим значением для 32-битного целого числа, в миллисекундах, 2147483647. Но в C# свойство CommandTimeout в секундах, а не миллисекунд, так что любой выше, чем 2147483 приведет в исключении.

Хотя это не бесконечно, это 24 дня, 20 часов, 31 минута и 23 секунды, что, надеюсь, удовлетворит ваши потребности.

Установка значения 0 не помогла мне. Свойство CommandTimeout не сохранит значение 0 и сохранит автоматическое изменение на 30.

Установка значения на -1, похоже, сработала, но я не тестировал ее достаточно, чтобы быть уверенным, что тайм-аут никогда не будет происходят.

Безопасный вариант: перейти с 2147483.

Смежные вопросы