Случайные ошибки DataReader и DataContext для конкретного потока, позволяющие изменять DataLoadOptions - PullRequest
2 голосов
/ 16 июля 2010

Мой проект .NET MVC достиг стадии тестирования с несколькими пользователями, и я получаю, казалось бы, случайные ошибки (с любого экрана на сайте), связанные с проблемами Linq2Sql DataReader, например:
'Неправильная попытка вызвать FieldCount, когда читатель закрыт.' и
'ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто. '
Эти ошибки также появляются реже во время однопользовательского тестирования, если дважды щелкнуть ссылку, или когда несколько вкладок в браузере или разные браузеры обновляются одновременно.

Мне интересно, не связаны ли эти проблемы с проблемами потоков DataContext.

В настоящее время я использую подход к хранилищу с отдельными хранилищами для каждого бизнес-процесса. Каждый класс репозитория запускает экземпляр DataContext в своем конструкторе, и это используется большинством методов в репозитории.
Однако некоторые методы обновляют DataLoadOptions для принудительной загрузки данных представления, поэтому эти методы создают свой собственный экземпляр DataContext.
Также на некоторых экранах отображается информация из нескольких бизнес-объектов, поэтому в одном запросе может быть задействовано 2 или 3 репозитория. Соответственно, для каждого запроса может быть создано несколько отдельных экземпляров DataContext.
Я пытался применять подход загрузки с нетерпением, используя DataLoadOptions там, где это необходимо, и применяя ToList () к результатам запроса, чтобы убедиться, что все загружено заранее (не дожидаясь, пока представление будет отображено) - поэтому каждый DataContext должен быть открыт только для довольно короткий период.

Поскольку ошибки, по-видимому, связаны с несколькими потоками, повторно использующими один и тот же DataContext (s), я думаю о реализации одного DataContext для каждого запроса в соответствии с определенным для потока объектом DataContextFactory Рика Страла (http://www.west -wind) .com / weblog / posts / 246222.aspx ) или более простой подход «хранилище данных о работе», как в примере Стива Сандерсона (http://blog.stevensanderson.com/2007/11/29/linq-to-sql-the-multi-tier-story/).

Но есть проблема с DataLoadOptions, которую нужно решить. Я мог бы создать дополнительные специфичные для потока DataContexts, но это, похоже, отходит от моей цели использования одного DataContext на запрос. Поэтому я смотрю либо на повторное использование того же DataContext, но временно изменяю LoadOptions для некоторых методов, как в примере Кевина Уоткина (http://www.mrkwatkins.co.uk/Blog/2010/05/)
или отказ от стандартного подхода DataLoadOptions в пользу использования хранимых процедур предварительной загрузки для предварительного заполнения EntityRefs, как обсуждалось Роджером Дженнингсом в журнале Visual Studio (http://visualstudiomagazine.com/Articles/2007/11/01/Optimize-LINQ-to-SQL-Performance.aspx?Page=3)

Так что мой вопрос: кто-нибудь сталкивался с подобными случайными проблемами чтения данных, как вы их решали, и могу ли я решить проблему, внедрив те решения, с которыми я связан?

Как всегда, времени мало - поэтому я не хочу тратить его на реализацию решения, если проблема на самом деле где-то еще. Любая помощь будет принята с благодарностью!

PS. Боюсь, это довольно общий вопрос, и я не включил никаких конкретных примеров кода, так как не уверен, в чем проблема на самом деле.

...