Допустимо ли статическое кэширование DatabaseFactory.CreateDatabase? - PullRequest
2 голосов
/ 05 января 2010

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

Глядя на документацию MSDN о безопасности потоков, я цитирую:

Любые открытые статические [...] члены этого типа являются потокобезопасными. Ни один из членов экземпляра не гарантированно является потокобезопасным.

Учитывая это, является ли это приемлемым / безопасным для кода, такого как этот пример ниже:

public static class BookingMapper
{
  public static Database Db { get; set; }

  static BookingMapper()
  {
    Db = DatabaseFactory.CreateDatabase();
  }

  public static string GetBooking(int id)
  {
    using (DbCommand cmd = Db.GetStoredProcCommand("getBooking"))
    {
      Db.AddInParameter(cmd, "@Id", DbType.Int32, id);
      using (IDataReader dr = Db.ExecuteReader(cmd))
      {
        ...
      }
    }
  }
}

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

Заранее спасибо.

Обновление:

Дальнейшие исследования показали мне статью PrimaryObjects.com , которая в разделе Putting the Database Factory to Use предполагает, что это приемлемо. Но мне все еще интересно, есть ли плюсы / минусы в этом?

Аналогичный вопрос

1 Ответ

3 голосов
/ 05 января 2010

1) Есть два способа интерпретировать эту стандартную фразу о безопасности потоков из MSDN, и я хотел бы, чтобы они разъяснили ее. Ваша интерпретация была бы хороша, но я считаю, что это означает следующее:

Любые члены (методы, поля, свойства и т. Д.), Являющиеся частью этого типа, а также общедоступные и статические, являются потокобезопасными

(например, есть два способа интерпретации подфразы "члены этого типа")

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

3) При дальнейшем чтении внутри библиотеки ent объект Database, возвращаемый вызовом CreateDatabase, не является самим соединением, и похоже, что управление соединением обрабатывается, как я уже говорил в пункте 2. Так что это выглядит Сам объект базы данных можно безопасно обмениваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...