Подтвердить что ты не робот

Настройка таймаута для SQL Server

Я использую VSTS 2008 + ADO.Net + С# +.Net 3.5 + SQL Server 2008. Я использую ADO.Net на стороне клиента, чтобы подключиться к серверу базы данных для выполнения процедуры хранения, а затем вернуть результат из процедуры хранения.

Вот мой код. У меня есть два вопроса о тайм-ауте,

  • Если я не устанавливаю явно никаких параметров, связанных с таймаутом, для подключения к серверу базы данных существуют ли какие-либо настройки таймаута (например, если не удается подключиться к серверу базы данных в течение некоторого времени по умолчанию, будет некоторый тайм-аут исключение?)?

  • Если я не устанавливаю явно никаких параметров, связанных с таймаутом, для выполнения процедуры хранилища существуют ли какие-либо настройки тайм-аута (например, если невозможно получить результаты от сервера к клиенту ADO.Net за некоторое время по умолчанию, будет какое-то исключение тайм-аута?)?

        using (SqlConnection currentConnection = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Trusted_Connection=true;Asynchronous Processing=true"))
        {
            // check current batch conut
            currentConnection.Open();
            using (SqlCommand RetrieveOrderCommand = new SqlCommand())
            {
                RetrieveOrderCommand.Connection = currentConnection;
                RetrieveOrderCommand.CommandType = CommandType.StoredProcedure;
                RetrieveOrderCommand.CommandText = "prc_GetOrders";
                RetrieveBatchCountCommand.Parameters.Add("@Count", SqlDbType.Int).Direction = ParameterDirection.Output;
                RetrieveBatchCountCommand.ExecuteNonQuery();
                int rowCount = Convert.ToInt32(RetrieveOrderCommand.Parameters["@Count"].Value);
            }
        }
    
4b9b3361

Ответ 1

Как уже упоминалось, gbn существует два типа тайм-аутов:

1) Тайм-аут подключения: это контролируется вашей строкой подключения:

Data Source=.;Initial Catalog=TestDB;
   Trusted_Connection=true;Asynchronous Processing=true

Если вы добавите Connect Timeout=120 в эту строку, ваше соединение попытается выполнить 120 секунд, чтобы открыть, а затем прервать.

Data Source=.;Initial Catalog=TestDB;
   Trusted_Connection=true;Asynchronous Processing=true;
   Connect Timeout=120;

2) Тайм-аут команды: для каждой команды вы также можете указать тайм-аут - ADO.NET будет ждать такого количества времени, прежде чем отменять ваш запрос. Вы указываете это на объекте SqlCommand:

    using (SqlCommand RetrieveOrderCommand = new SqlCommand())
    {
       RetrieveOrderCommand.CommandTimeout = 150;
    }

Ответ 3

В классе sqlconnection есть свойство по имени "ConnectionTimeout". Это не может быть напрямую использовано для установки требуемого значения времени ожидания соединения, поскольку оно является readonly, т.е. реализовано только "get", а "set" не реализовано в этом свойстве. Так мы должны использовать ключевое слово "Тайм-аут соединения" в самой строке подключения и установить желаемое значение.

EXI: "Источник данных = (локальный); Начальный каталог = AdventureWorks; Интегрированная безопасность = SSPI; Тайм-аут соединения = 30"; (30 означает 30 секунд)

30 секунд - это максимальное время, установленное для установления соединения с сервером (например, 172.160.0.2 или что-то вроде ADMINISTRATOR\SQLEXPRESS). Если он не смог сразу установить соединение с сервером, то он попытается выполнить до 30 секунд. Если сервер действителен и может подключаться к серверу, а если имя базы данных или учетные данные для входа недействительны, то этот таймаут не применим. Он немедленно выдает исключение для недопустимых учетных записей или базы данных