2013-04-29 3 views
0

Я просто унаследовал приложение ASP.NET MVC4, который имеет базовый класс со следующим элементом:защищенный статический в базовом классе

protected static DBMainDataContext m_dataContext = new DBMainDataContext(); 

Этот базовый класс наследуется двумя другими классами, как использовать LINQ для чтения данных из базы данных. Тот факт, что этот базовый класс имеет статический контекст данных, создает ли это проблему? Кажется, что мы получаем ошибки вдоль линии, где DataReader недоступен, поскольку он уже открыт. Может быть, это и есть причина? Если да, то как его объявить? Я просто удаляю статическое ключевое слово?

Спасибо!

+0

Как правило, повторное использование экземпляра 'DBContext' или' ObjectContext' представляется плохой идеей. Я бы сказал, что лучший способ сделать это - создать некоторый 'Func ', который возвращает новый экземпляр каждого раза, когда это требуется. –

+0

@HighCore Технически не нужно ничего менять, кроме статического ключевого слова, так как контроллер, содержащий его, создается MVC для каждого запроса. –

+0

Правильно ли вы закрываете datareader, когда закончите чтение данных из базы данных? – ryrich

ответ

0

Да, удаление ключевого слова static - это путь.

Если это LINQ to SQL или Entity Framework Context, тогда стоимость строительства объекта должна быть очень низкой, и поэтому вы должны использовать новый экземпляр для каждого запроса.

Возможно, вы также должны убедиться, что ваши DataReaders правильно закрыты (как предложил ryrich). Лучший способ обеспечить это, чтобы обернуть их использование в использовании-блока:

using(var reader = ...) 
{ 
    // code to use the reader here 
} 
+0

Это контекст LINQ to SQL, и, как я уже упоминал, в коде нет явного манипулирования DataReader, поэтому я предполагаю, что LINQ использует один за кулисами. Я попытаюсь удалить статическое ключевое слово и посмотреть, получим ли мы больше этих ошибок. – Ray

0

Это общее правило, что статические члены должны быть поточно. Таким образом, ваш статический m_dataContext должен быть потокобезопасным.

DBMainDataContext не является потокобезопасным. Поэтому, если два потока (два запроса ASP.NET) получают доступ к контексту данных, он одновременно изменяется двумя потоками. Это приведет к конфликтам.

Так у вас есть два варианта:

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

И имейте в виду, что вариант 2 является довольно безмозглым решением проблемы, учитывая, что это веб-приложение. –

Смежные вопросы