DataReader уже открыт при использовании LINQ - PullRequest
0 голосов
/ 22 апреля 2010

У меня есть статический класс, содержащий статическое поле, которое ссылается на объект-оболочку DataContext.

DataContext в основном создается Visual Studio, когда мы создали файл dbml, и содержит методы для каждой из хранимых процедур, которые есть в БД.

Наш класс в основном имеет набор статических методов, которые запускают каждый из этих хранимых методов proc и затем возвращают массив на основе запроса LINQ.

Пример:

public static TwoFieldBarData[] GetAgesReportData(string pct)
        {
                return DataContext
                .BreakdownOfUsersByAge(Constants.USER_MEDICAL_PROFILE_KEY, pct)
                .Select(x => new TwoFieldBarData(x.DisplayName, x.LeftValue, x.RightValue, x.TotalCount))
                .ToArray();
        }

Время от времени мы получаем следующую ошибку:

Уже есть открытый DataReader связано с этой командой, которая должны быть закрыты ели

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

Может ли это быть случаем для упаковки каждого из вызовов DataContext LINQ в lock(){}, чтобы получить эксклюзивность для этого типа и гарантировать, что другие запросы помещаются в очередь?

Ответы [ 3 ]

1 голос
/ 22 апреля 2010

DataContext не предназначен для долговременного использования и определенно не предназначен для использования с несколькими потоками.

Статический член является долгоживущим и доступен для нескольких потоков. Этот конфликт может быть корнем вашей проблемы.

0 голосов
/ 22 апреля 2010

Как отметил Брайан Уоттс. DataContext должен быть недолгим. Убедитесь, что вы используете DataContext только в случае необходимости и в течение небольшого периода времени.

using(var db = new DataContext()) 
{
    // do your things here! 
}

Надеюсь, это поможет!

0 голосов
/ 22 апреля 2010

Блокировка контекста данных может быть проблематичной, она может действительно подорвать вашу производительность или привести к тупикам, если вы не будете осторожны.

Это обычно происходит, когда вы циклически повторяете записи в считывателе, а затем пытаетесь выполнить в нем другую команду запроса (например, загрузку иерархической объектной модели)

Попробуйте включить добавление параметра MultipleActiveResultSets = True в строку подключения, если это возможно, что обычно решает проблему более чисто, чем попытка разделения вызовов.

http://msdn.microsoft.com/en-us/library/cfa084cz(VS.80).aspx

Кроме того, используйте свой контекст данных для наименьшего возможного объема и одну «единицу работы», если хотите. Если вам не нужно поддерживать какое-то состояние (например, загрузить некоторые объекты и затем сохранить их обратно сразу), вам не следует многократно использовать контекст данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...