Мне нужно убедиться, что приложение использует минимальное количество соединений с базой данных - PullRequest
2 голосов
/ 17 марта 2012

Вопрос от сертификационного экзамена:

Вы используете Microsoft Visual Studio 2010 и Microsoft .NET Framework 4 для создания приложения. Приложение содержит следующий сегмент кода. (Номера строк приведены только для справки.)

01  class DataAccessLayer
02  {
03    private static string connString;
04
05    ...
06    public static DataTable GetDataTable(string command){
07
08      ...
09    }
10  }

Вам необходимо определить жизненный цикл соединения класса DataAccessLayer. Вы также должны убедиться, что приложение использует минимальное количество соединений с базой данных. Что делать?

[A] Вставьте следующий сегмент кода в строку 04.

private static SqlConnection conn = new SqlConnection(connString);
public static void Open(){
  conn.Open();
}
public static void Close(){
  conn.Close();
}

[B] Вставить следующий сегмент кода в строку 04.

private SqlConnection conn = new SqlConnection(connString);
public void Open(){
  conn.Open();
}
public void Close(){
  conn.Close();
}    

[C] Заменить строку 01 следующим сегментом кода.

class DataAccessLayer : IDisposable 

Вставьте следующий сегмент кода в строку 04.

private SqlConnection conn = new SqlConnection(connString);
public void Open(){
  conn.Open();
}
public void Dispose(){
  conn.Close();
}

[D] Вставить следующий сегмент кода в строку 07.

using (SqlConnection conn = new SqlConnection(connString)){
  conn.Open();
}    

Некоторые люди утверждают, что правильный ответ - [D], но с моей точки зрения это не имеет смысла, потому что соединение открывается и сразу закрывается после блока «using».

Может ли кто-нибудь указать правильный ответ и объяснить, почему?

Спасибо !!!

Ответы [ 3 ]

1 голос
/ 17 марта 2012

Нет правильного ответа.

  • AC неверны, потому что они не обрабатывают исключения.
  • C также неправильно, потому что вы хотите инкапсулировать доступ к данным из вашего метода, который возвращает DataSet.Наборы данных отключены, и нет никаких указаний на то, что вы делаете что-либо, что требует, чтобы класс содержал открытые соединения между вызовами методов, поэтому нет причин заставлять весь класс поддерживать соединение.Просто сделайте это в каждом методе, который делает вызовы БД.
  • D близко, но неправильно.Чтобы это исправить, добавьте код доступа к данным после вызова conn.Open () внутри блока using () {...}.

Примечание: я не уверен, что вы не указали код доступа к данным после вызова .Open () в D. Если вы предполагали, что это понятно, то D на самом деле правильныйответ.Когда соединение удаляется, оно возвращается в пул соединений.Пул соединений поможет вам минимизировать количество открытых соединений.Если вам нужно буквально закрыть соединения, даже если они неактивны, вам нужно начать настройку использования пула соединений.

0 голосов
/ 17 марта 2012

D является правильным. Вы будете использовать только одно соединение. По крайней мере, вы на это надеетесь. В ADO.NET есть функции «Пул соединений». Вы не можете быть абсолютно уверены в том, что происходит, если не используете решение A (одно статически распределенное соединение).

Поскольку вы должны использовать пул соединений как можно чаще, D по-прежнему правильный.

0 голосов
/ 17 марта 2012

D реализует using ключевое слово, в котором область кода и будет удалена.

A, B, C все еще находятся в жизненном цикле уровня классов / программ, поэтому каждый экземпляр будет охватывать другие соединения.

...