Это действительно, как вы используете Linq-To-Sql? - PullRequest
2 голосов
/ 17 января 2011

Я увидел интересную ссылку о Linq-To-Sql: Более эффективный доступ к базе данных

Глядя на мой собственный код, я понял, что я также не выбрасывал DataClassesDataContext. Это проблема? Я не знаю, но я продолжил поиск по своему коду и добавил using (DataClassesDataContext db = new DataClassesDataContext()) по всему коду.

Теперь вот интересная вещь. Мы регистрируем почти каждый доступ к странице и транзакции в нашем коде. Теперь у меня есть блок кода, который выглядит следующим образом:

protected WriteLog(String activity)
{
   using (DataClassesDataContext db = new DataClassesDataContext())
   {
       ... Do db write with Linq
   }
}

Это очень интенсивно используемая функция со скоростью не менее 50 вызовов в секунду в любое время. Поэтому, прежде чем предположить, что мы пострадали от потенциальных «утечек», что является проблемой. Но теперь нам кажется, что мы не будем пропускать ресурсы БД, а вместо этого будем тратить много времени только на открытие и закрытие соединений с базой данных. Это не может быть правдой, не так ли? Приведенный выше код теперь открывает и закрывает соединение с БД для каждой отдельной записи журнала нашими пользователями , добавляя еще больше накладных расходов, чем просто оставляя DataClassesDataContext для сбора мусора в будущем?

1 Ответ

5 голосов
/ 17 января 2011

Ваш вопрос имеет ложную предпосылку: вы полагаете, что, не избавляясь от контекста, вы оставляете соединение открытым для других пользователей.Это неверноВсе, что вы делаете, это откладывает закрытие соединения до сборки мусора;последующие запросы всегда открывают новое соединение, если они создают экземпляр контекста.

При этом класс контекста является легковесным (как и объекты соединения с базой данных).Ваши соединения автоматически объединяются, поэтому необязательно соотношение 1: 1 между объектами соединений с базой данных и фактическими соединениями с базой данных.

Правильно удаляя класс, заключая его в блок using, вы теперь используетеэто правильно (не каламбур).

...