Как, когда и нужно ли вообще закрывать connection к базе в singleton классе?

На все приложение должно существовать единственное подключение к базе.
Реализовано с помощью singletion паттерна.

public sealed class Connection
{
      private static Connection _instance = null;
      private Connection() { }

      public static Connection Instance
      {
          get
          {
              if (_instance == null) _instance = new Connection();
              return _instance;
          }
      }

      public SqlConnection GetSqlConnection()
      {
          return new SqlConnection(ConfigurationManager.ConnectionStrings["CancellationCS"].ToString());
      }
}


Как лучше делать:
-один раз открыть connection и не закрывать до завершения приложения? (как лучше закрывать connection при завершении приложения)
-каждый раз(т.е. при любом запросе к БД) открывать и закрывать connection?
  • Вопрос задан
  • 6110 просмотров
Пригласить эксперта
Ответы на вопрос 3
@gleb_kudr
В общем случае 1. Открытие коннекта - достаточно затратная процедура чтобы делать ее на каждый чих. Можете сами измерить скорость/нагрузку в тесте с открытием одного коннекта или множества коннектов.
Ответ написан
Комментировать
dima117
@dima117
Разработчик интерфейсов
Зависит от того, насколько часто приложение обращается к БД.
Если часто, то лучше использовать одно общее соединение. Если редко, то лучше закрывать, чтобы освободить ресурсы.

Например, в веб-приложениях, как правило, открывается отдельное соединение на каждый HTTP-запрос и в нем выполняются несколько SQL запросов.

Также почитайте про connection pool.
Грубо говоря, это способ оптимизации приложения, при котором есть некоторый пулл соединений. При открытии соединения, если такое уже есть в пулле, оно берется оттуда (соответственно, не тратятся ресурсы на его инициализацию). При закрытии соединения оно возвращается в пулл и может быть использовано повторно. Инфраструктура .NET Framework управляет пуллом соединений в соответствии с указанными Вами настройками.
Ответ написан
Комментировать
Mephistophele
@Mephistophele
Стоит начать с вопроса: это десктоп приложение или веб?
Если первое, то лучше что-то типа:
class StaticClass 
{
   static StaticClass() {
       AppDomain.CurrentDomain.ProcessExit +=
           StaticClass_Dtor;
   }

   static void StaticClass_Dtor(object sender, EventArgs e) {
        // clean it up
   }
}


Если веб, то выпиливайте ваш класс к чертям. :)

ЗЫ: а вообще использование синглтонов для работы с БД - зло. Лучше юзать какой-нибудь ORM, тот же Entity Framework альбо NHibernate.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы