LINQ to SQL генерирует исключения при стресс-тестировании - PullRequest
2 голосов
/ 07 декабря 2009

У меня есть это веб-приложение под управлением ASP .NET MVC 1.0 с LINQ 2 SQL

Я замечаю очень странную проблему с исключениями бросания SQL в LINQ 2 (в основном это Заданное недопустимое приведение или последовательность содержит более одного элемента) при определенной загрузке.

Большая проблема в том, что я не говорю о Real Heavy / Professional Stress Testing ... По сути, я делаю, открываю FireFox и Chrome и удерживаю F5 по десять секунд в каждом (я называю этого беднягу стресс-тестирование) - о чудо; веб-приложение генерирует эти исключения случайным образом в течение следующих двух или пяти минут. Если я перезапущу приложение из IIS7 (или перезапущу WebDev, если под Visual Studio), то сразу все вернется в нормальное состояние. Как будто ничего не случилось.

Сначала я подозревал, как я обращаюсь с DataContext, возможно, я должен был использовать его в каждом Application_End из Global.asx, но это ничего не изменило.

Сейчас у меня есть один публичный статический объект DataContext, используемый всеми запросами. Я не уничтожаю это или воссоздаю это. Это правильный способ сделать это? Я должен избавиться от этого? Когда именно я должен избавиться от него?

Есть несколько вещей, которые происходят с каждым запросом - например, на каждой странице объект User (для текущего пользователя) загружается из базы данных, а атрибут «LastSeen» обновляется до DateTime.Now. Другие вещи (например, облако тегов) кэшируются.

Есть идеи, почему это происходит?

Ответы [ 3 ]

4 голосов
/ 07 декабря 2009

Класс DataContext не является потокобезопасным - вам нужно создать новый для каждой операции. См. Эту статью Рика Штраля ( Linq to SQL DataContext Lifetime Management )

3 голосов
/ 07 декабря 2009

Вы должны утилизировать текст данных после каждой группы запросов и использовать его как

using(MyDataContext dc = new MyDataContext())
{
    var x = dc.Table.Single(a=>a.Id=3);
    //do some more related stuff, but make sure your connection won't be open too long
}

Не используйте один статический текст данных для каждого запроса. Будете ли вы использовать один и тот же объект подключения в обычном ADO.Net для каждого запроса?!


См. Также http://blog.codeville.net/2007/11/29/linq-to-sql-the-multi-tier-story/

DataContext не является поточно-ориентированным, поскольку как я знаю

Вы теряете изоляцию и не может контролировать, когда SubmitChanges () звонил - одновременные запросы будут мешать друг другу

Память весьма вероятны утечки

1 голос
/ 07 декабря 2009

Создайте DC для каждой операции, как предлагает Роб, ИЛИ используйте контейнер IoC, чтобы иметь общий DC для запроса.

НЕ УДАЛЯЙТЕ DC - они разработаны, чтобы быть легкими. Утилизация не только не обязательна, но может привести к плохой практике и, возможно, к другим проблемам с многопоточностью в будущем, которые, возможно, будет еще труднее отследить.

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