Linq-to-SQL и sp_reset_connection - PullRequest
       31

Linq-to-SQL и sp_reset_connection

5 голосов
/ 16 сентября 2011

У меня есть .NET 4.0 Winform и .NET 4.0 Windows Service, которые оба подключаются к базе данных SQL 2005/2008 через LINQ to SQL.Он хорошо и быстро работает в нашей тестовой среде с идеальным клоном производственных данных, но в производственной среде он работает очень медленно и имеет низкую загрузку ЦП и пропускную способность.Я также заметил сотни таймаутов SQL в день, даже для самых маленьких запросов в хорошо проиндексированной базе данных.Итак, я запустил Profiler ...

Я обнаружил, что sp_reset_connection составляет одну треть от общей длительности ЦП SQL и 90% всех общих вызовов SQL во время 10-минутного захвата под нагрузкой,

  • Я попытался отключить и включить пул подключений и перебирать количество разрешенных подключений и время ожидания подключения в строке подключения.Ни один из них не имел никакого эффекта.
  • Я заменял свои запросы LINQ на запросы ADO.NET, когда сталкивался с ними.Эти старые запросы ADO.NET никогда не истекают.Только LINQ.
  • Я заметил другие серьезные проблемы с производительностью на этом сервере, но я не уверен, как подойти к теме с системным администратором клиента.
  • У меня есть Adminдоступ к серверу приложений, на котором работает служба.У меня нет доступа к серверу терминалов, на котором они запускают Winform, и к серверу SQL.

  • Что заставляет sp_reset_connection запускаться так часто?

  • Есть ли способ обойти эти вызовы, не вырывая все LINQ из моего приложения?
  • Есть ли способ уменьшить количество вызовов к этой хранимой процедуре?
  • Есть ли способ уменьшить количество процессорного времени, которое требуется SQL-серверу для этих вызовов?
  • Могу ли я что-нибудь испортить, если оставлю пул отключенным и заменим этот сохраненный процесс, скажем, пустым?

Ответы [ 2 ]

4 голосов
/ 16 сентября 2011

Нашли другие страницы по этому поводу, одна из них предложила следующее:

Для сброса соединения откройте ваше соединение DataContext, прежде чем работать с ним, и закройте его в конце.

db.Connection.Open()
... work...
db.Connection.Close()
1 голос
/ 16 сентября 2011

sp_reset_connection происходит, когда sqlconnection возвращается в пул соединений, теперь это не должно быть проблемой.

но теперь вопрос в том, почему вы получаете тайм-ауты?это сервер sql, который не может справиться с количеством транзакций, или это пул соединений, который истощается, никогда не использовал Linq-to-sql, но убедитесь, что вы располагаете всем, что можете располагать, когда вы закончите с объектами ...

Редактировать: пул соединений существует по той причине, что его удаление приведет к снижению производительности, а удаление sp_reset_connection приведет к странным ошибкам, поскольку данные будут переданы следующему пользователю соединения ...

для уменьшения количества sp_reset_connection единственный способ, который вы можете сделать, это попытаться повторно использовать одно и то же соединение для максимально возможного количества запросов!

...