Как я избегаю утечки памяти с LINQ к SQL?

существует двусмысленность из-за doSomething (char [] obj) и doSomething (Integer obj).

char [] и Integer оба одинаковы выше для null, поэтому они двусмысленны.

20
задан Eddie 28 February 2009 в 14:03
поделиться

4 ответа

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

15
ответ дан 29 November 2019 в 23:37
поделиться

Спасибо парни - я проверю метод ClearCache. Только для разъяснения (для будущих читателей), ситуация, в которой я получал память usuage, была чем-то вроде этого:

using(DataContext context = new DataContext())
{
   while(true)
   {
      int skipAmount = 0;
      var rows = context.tables.Select(x => x.Dept == "Dept").Skip(skipAmount).Take(100);

      //break out of loop when out of rows

      foreach(table t in rows)
      {
         //make changes to t   
      }

      context.SubmitChanges();
      skipAmount += rows.Count();

      rows.Clear();
      rows = null;

      //at this point, even though the rows have been cleared and changes have been
      //submitted, the context is still holding onto a reference somewhere to the
      //removed rows.  So unless you create a new context, memory usuage keeps on growing
   }
}
3
ответ дан 29 November 2019 в 23:37
поделиться

DataContext отслеживает все объекты, которые он когда-либо выбирал. Это не выпустит это, пока это не будет собрано "мусор". Кроме того, поскольку это реализует IDisposable, необходимо назвать Dispose или использовать using оператор.

Это - правильный способ пойти:

using(DataContext myDC = new DataContext)
{
  //  Do stuff
} //DataContext is disposed
20
ответ дан 29 November 2019 в 23:37
поделиться

Как David Points, необходимо избавиться от DataContext с помощью блока использования.

кажется, что Ваша первоочередная задача о создании и расположении набора объектов DataContext. Это - то, как linq2sql разработан. DataContext предназначен, чтобы иметь короткое время жизни. Так как Вы вытягиваете много данных из DB, он имеет смысл, что будет большое использование памяти. Вы на правильном пути путем обработки данных в блоках.

не боятся создания тонны DataContexts. Они разработаны, чтобы использоваться тот путь.

6
ответ дан 29 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: