Обработка соединения с контекстной базой данных Linq-to-sql

Каковы правила того, как текст данных linq-to-sql поддерживает соединение с базой данных открытым?

Возник вопрос, когда мы сделали несколько тестов производительности для одного SubmitChanges() на обновленный объект вместо одного SubmitChanges() для всего пакета объектов. Результаты:

  

Вставка 3000 элементов за один вызов SubmitChanges () ... Продолжительность: 1318 мс

     

Вставка 3000 элементов за один вызов SubmitChanges () в течение   Transactionscope ... Продолжительность: 1280 мс

     

Вставка 3000 элементов в отдельные вызовы SubmitChanges () ... Продолжительность:   4377ms

     

Вставка 3000 элементов в отдельные вызовы SubmitChanges () в пределах   транзакция ... Продолжительность: 2901 мс

Обратите внимание, что при выполнении отдельных SubmitChanges() для каждого измененного объекта размещение всего в транзакции повышает производительность , что было довольно неожиданно для нас. В профилировщике сервера SQL мы видим, что отдельные вызовы SubmitChanges() внутри транзакции не сбрасывают соединение с БД для каждого вызова, в отличие от один без транзакции.

В каких случаях контекст данных поддерживает соединение открытым? Есть ли подробная документация о том, как linq-to-sql обрабатывает соединения?

7 голосов | спросил Anders Abel 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 20 Sep 2011 20:09:31 +0400 2011, 20:09:31

4 ответа


0

Вы не показываете всю картинку; По умолчанию LINQ-to-SQL будет заключать вызов в SubmitChanges в транзакции. Если вы заключите его в другую транзакцию, вы не увидите сброса соединения; это невозможно, пока все вызовов SubmitChanges не будут завершены, а затем, когда будет совершена внешняя транзакция. /р>

ответил casperOne 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 20 Sep 2011 20:44:57 +0400 2011, 20:44:57
0

Может быть ряд факторов, которые могут влиять на время, кроме того, когда соединения открываются /закрываются.

edit: я удалил немного о отслеживаемых сущностях после того, как понял, как linq2sql управляет кэшированными сущностями и грязными сущностями по отдельности.

Вы можете получить хорошее представление о том, как управлять соединениями под прикрытием, используя Reflector или какой-либо другой дизассемблер для проверки методов класса SqlConnectionManager. SubmitChanges будет вызывать ClearConnection на своем IProvider (обычно SqlProvider, который затем использует SqlConnectionManager) после отправки, если он обернул отправку своей собственной транзакцией, но не если SubmitChanges является частью более крупной транзакции. Когда соединение открывается и закрывается, зависит от того, есть ли другое действие, использующее SqlConnectionManager.

ответил hatchet 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 20 Sep 2011 21:06:25 +0400 2011, 21:06:25
0

В последнее время я тоже с этим сталкивался. Вызов SubmitChanges 3000 раз не будет хорошей идеей, но тогда, в зависимости от того, насколько важно вставить каждую запись, вы можете захотеть сделать это, в конце концов это займет всего 1000 мс.

Область транзакций и несколько SubmitChanges - это то, что я ожидал увидеть. Поскольку вы все еще в пределах одной транзакции, я ожидал бы, что SQL-сервер справится с этим лучше, что кажется. Один SubmitChanges и использование явного /неявного TransactionScope Кажется, дает тот же результат, что и следовало ожидать. Там не должно быть никакой разницы в производительности.

Я думаю, соединения создаются, когда это необходимо, но вы должны помнить, что это будет объединено с вашим провайдером, поэтому, если строка вашего соединения не меняется, вы должны подключиться к тому же пулу соединений, который даст та же производительность независимо от подхода. Поскольку LINQ-SQL использует SqlConnection за кулисами, некоторая информация об этом находится в следующем:

http://msdn.microsoft.com/en -us /библиотека /8xx3tyca (VS.80) .aspx

Если ваша производительность после грубой силы, посмотрите на переход в Stored Proceedure для вставки с явным TransactionScope. Если это не достаточно быстро, посмотрите на использование SqlBulkCopy. 3000 строк должны быть вставлены быстрее, чем 1000 мс.

ответил Mig 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 20 Sep 2011 22:45:20 +0400 2011, 22:45:20
0

Вы пробовали открывать и закрывать соединение самостоятельно: Принудительное открытие соединения DataContext (LINQ) р>

Я думаю, что в этом случае вам не нужна дополнительная транзакция.

ответил Pleun 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 22 Sep 2011 01:56:02 +0400 2011, 01:56:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132