Случайные ошибки DataReader и DataContext для конкретного потока, позволяющие изменять DataLoadOptions
Мой проект.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, которую нужно решить. Я мог бы создать дополнительные специфичные для потока DataContext s, но это, похоже, отходит от моей цели использования одного 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)
Итак, у меня вопрос: кто-нибудь сталкивался с подобными случайными проблемами с DataReader, как вы их решали, и могу ли я решить проблему путем реализации тех решений, с которыми я связан?
Как всегда, времени мало - поэтому я не хочу тратить его на реализацию решения, если проблема на самом деле где-то еще. Любая помощь будет принята с благодарностью!
PS. Боюсь, это довольно общий вопрос, и я не включил никаких конкретных примеров кода, так как не уверен, в чем проблема на самом деле.