В приложении сервера .NET Remoting мой объект подключения к базе данных должен быть статическим - PullRequest
1 голос
/ 22 марта 2012

У меня есть приложение клиент-сервер, которое использует .NET Remoting.
У меня есть вспомогательный класс на серверной части моего приложения DBQuery.
DBQuery содержит DatabaseConnection, а также объект SQLCommand Commander и выполняет запросы.передается ему.

Каждый раз, когда выполняется запрос, он проверяет, что Commander имеет открытое соединение.
(при необходимости он восстанавливает Commander.)

Учитывая, что он подключается только кодну базу данных, я должен сделать мой DBConnection статическим?(DBConnection создает командующего, DBConnection.CreateCommand())

текущие свойства, определенные ниже:

/// <summary> connection used for querying with </summary>
public DBConn DBConnection 
{ get { return _conn ?? (_conn = new DBConn()); } }

/// <summary> Command object for processing the queries </summary>
private SqlCommand Commander
{
    get
    { 
      return _commander ??  
            (_commander = DBConnection.Connection.CreateCommand());
    }
}

DBConn - переносит SqlConnection и предоставляет соответствующую информацию о соединениииз app.config

Ответы [ 2 ]

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

Даже если оно статическое, никогда не использует одно соединение - во-первых, я не верю, что соединение является поточно-ориентированным, поэтому оно не обязательно будет любезновызывается параллельно из двух разных клиентов.

Даже если я ошибаюсь в этом (и если это так, я все равно не буду разделять одно соединение между несколькими потоками), но если что-то случится с сервером базы данныхскажем, он перезапускается, или сама служба (из-за обновления, выпущенного вашей группой поддержки), затем соединение будет разорвано, и у вас не будет возможности открыть его снова - необходимо перезапустить службу / приложение.Скорее всего, в следующий раз, когда вы попытаетесь что-то с ним сделать, это действительно вызовет исключение.

Кроме того, где вы располагаете соединением?Очень трудно избавиться от статического объекта, если вы не выполняете работу, чтобы подключиться к событию выключения, которое не всегда надежно.Полагаться на закрытие AppDomain, чтобы распоряжаться чем-то для вас, просто не очень хорошая практика.

Создайте соединение, когда вам это нужно, и избавьтесь от него, когда закончите с ним.Основываясь на коде, который вы дали, в самых простых терминах:

using(var conn = new DbConn().Connection)
{
  SqlCommand command = conn.CreateCommand();
  /* query and get results here */
}

Хотя в действительности вы можете захотеть сделать вас DbConn классом IDisposable и приковать цепочку к базовому Connection '* Dispose метод в реализации IDisposable.Dispose - таким образом вы можете сделать

using(var dbconn = new DbConn())
{
  //now you can use dbconn.Connection knowing that it will be disposed of
}

Примечание - блок using все равно будет работать, если new DbConn() будет заменен заводским методом или свойством get - itпросто гарантирует, что Dispose() вызывается для объекта при выходе из блока, и даже если возникает исключение.

Делая это, вы обойдете все проблемы, которые я выделил в первой половине моего ответа.

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

Инфраструктура осуществляет управление подключениями (включая пулы) за кулисами, поэтому я рекомендую держать ваш код чище, не делая его статичным.

...