linq to sql в многопоточной среде (и WCF) - PullRequest
1 голос
/ 16 сентября 2010

мы разработали многопоточный сервер, который использует linq to sql в каждом из своих потоков. тесты выглядят не очень хорошо ... после просмотра нашего кода возник большой вопрос: поддерживает ли linq to sql такие среды вообще? если да, мы предполагаем, что мы должны создать выделенный объект DataContext для каждого потока? если да, какова стоимость такого подхода?

Если это будет сложно, я думаю, мы сбросим linq в sql и откатимся к подключенному подходу .. (?)

аналогичный вопрос был поднят со стороны (на вызов) API на основе WCF: мы используем одноэлементный объект DataContext для всех вызовов функций WCF? или мы должны инициировать DataContext для каждого вызова WCF API?

Спасибо! Офер

Ответы [ 2 ]

2 голосов
/ 17 сентября 2010

DataContext

Любые члены экземпляра не гарантируют поточно-ориентированность.

Читать как: этот класс не является потокобезопасным, и экземпляры не должны совместно использоваться потоками, если не реализована блокировка.

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

Имейте в виду, что вызов SubmitChanges для текста данных отправляет все измененные записи, которые он отслеживает, обратно в базу данных ... это может быть очень плохо, если несколько пользователей совместно используют текст данных даже с блокировкой.


Также из той же статьи:

Как правило, экземпляр DataContext рассчитан на одну «единицу работы», однако ваше приложение определяет этот термин. DataContext легок и не дорог в создании. Типичное приложение LINQ to SQL создает экземпляры DataContext в области действия метода или как член недолговечных классов, представляющих логический набор связанных операций с базой данных.


Если это будет сложно, я думаю, мы сбросим linq в sql и откатимся к подключенному подходу ..

Вы также не должны совместно использовать объект SqlConnection между потоками без реализации блокировки.

0 голосов
/ 16 сентября 2010

Потоки имеют свой собственный соответствующий стек переменных и ссылок. Так что да, я думаю, вам понадобится DataContext для каждого потока.

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