При использовании Enterprise Library возникла проблема с необходимостью вручную закрывать соединения с БД, поскольку GC при сканировании кучи ищет элементы вне области видимости.
Соединение, которое является частью пула, который используется, но состояние соединения нарушено или извлекается, но вы уже получили свои результаты, останутся открытыми, и дескрипторы соединения в пуле закончатся.
Таким образом, добавление ручной проверки соединения и принудительное закрытие соединения является хорошей формой.
Теперь возьмите SubSonic. С помощью базы EntLib я делаю следующее в блоке finally:
public static bool GetISOCountryCodes(out DataSet dsISOCountryCodes, out Response dbResponse)
{
dbResponse = new Response();
dsISOCountryCodes = new DataSet();
StoredProcedure sp = null;
try
{
sp = SPs.GetISOCountryCodes(null);
dsISOCountryCodes = sp.GetDataSet();
// set the response object properties
dbResponse = new Response((int)sp.OutputValues[0]);
return dbResponse.IsValid;
}
catch (System.Exception ex)
{
return dbResponse.IsValid;
}
finally
{
if (sp.Command != null && sp.Command.ToDbCommand().Connection != null &&
sp.Command.ToDbCommand().Connection.State == ConnectionState.Open)
sp.Command.ToDbCommand().Connection.Close();
}
}
Я знаю, что было сказано, что вам не нужно делать это вручную, поскольку SubSonic сделает это за вас, однако, я хотел бы знать, сталкивался ли кто-нибудь с проблемами, когда SubSonic не закрывал соединения (еще раз, как он использует EntLib в корне), и если есть лучшие способы сделать это.
Очевидно, что во всех моих методах вызова данных я буду ссылаться на один, скажем, метод ConnectionCloser ().
Спасибо.