Настройка таймаута для 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);
}
}
Ответы
Ответ 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;
}
Ответ 2
Да, есть два типа тайм-аута, которые можно установить
Оба по умолчанию - 30 секунд в VBA,.net и т.д.
Ответ 3
В классе sqlconnection есть свойство по имени "ConnectionTimeout". Это не может быть напрямую использовано для установки требуемого значения времени ожидания соединения, поскольку оно является readonly, т.е. реализовано только "get", а "set" не реализовано в этом свойстве. Так мы должны использовать ключевое слово "Тайм-аут соединения" в самой строке подключения и установить желаемое значение.
EXI:
"Источник данных = (локальный); Начальный каталог = AdventureWorks; Интегрированная безопасность = SSPI; Тайм-аут соединения = 30"; (30 означает 30 секунд)
30 секунд - это максимальное время, установленное для установления соединения с сервером (например, 172.160.0.2 или что-то вроде ADMINISTRATOR\SQLEXPRESS). Если он не смог сразу установить соединение с сервером, то он попытается выполнить до 30 секунд. Если сервер действителен и может подключаться к серверу, а если имя базы данных или учетные данные для входа недействительны, то этот таймаут не применим. Он немедленно выдает исключение для недопустимых учетных записей или базы данных