Может ли служба WCF без сохранения состояния выиграть от встроенного пула соединений с базой данных?

Я понимаю, что типичное приложение .NET, которое обращается к базе данных (n SQL Server), не должно делать ничего особенного, чтобы извлечь выгоду из пула соединений. Даже если приложение неоднократно открывает и закрывает соединения с базой данных, они объединяются фреймворком (при условии, что такие вещи, как учетные данные, не меняются от вызова к вызову).

Мой сценарий использования, кажется, немного отличается. Когда моя служба создается, она один раз открывает соединение с базой данных, выполняет некоторую работу, закрывает соединение и возвращает результат. Затем он разрывается WCF, и следующий входящий вызов создает новый экземпляр службы.

Другими словами, моя служба создается для каждого клиентского вызова, как в [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]. Служба обращается к базе данных SQL Server 2008. Я использую .NET Framework 3.5 SP1.

Пул соединений все еще работает в этом сценарии, или мне нужно свернуть свой собственный пул соединений в виде синглтона или каким-либо другим способом (IInstanceContextProvider?). Я бы предпочел не изобретать велосипед, если это возможно.


person vladimir    schedule 30.04.2010    source источник
comment
Чем это отличается от обычного случая?   -  person John Saunders    schedule 30.04.2010
comment
Я думал, что снос службы WCF означает срыв домена приложения, в котором он находится, нечто большее, чем вызов (необязательный) Dispose() для него.   -  person vladimir    schedule 30.04.2010
comment
Отличный вопрос, я почти то же самое задал.   -  person Boris B.    schedule 02.10.2011
comment
Я столкнулся с той же проблемой. Я использовал все хорошие методы по умолчанию, такие как использование, а также закрытие соединения, наконец, если оно все еще открыто. Но я думаю, что служба WCF по умолчанию предназначена для каждого сеанса, и каждый раз будет создаваться новый экземпляр от разных клиентов, работает ли пул соединений? Я вижу оба ответа. Так какой же окончательный вывод?   -  person Mahesh Malpani    schedule 18.01.2016


Ответы (2)


Типичное приложение WCF, которое обращается к базе данных (n SQL Server), не должно делать ничего особенного, чтобы извлечь выгоду из пула соединений. Даже если приложение неоднократно открывает и закрывает соединения с базой данных, они объединяются фреймворком (при условии, что такие вещи, как учетные данные, не меняются от вызова к вызову).

Модель создания экземпляров службы создает и уничтожает экземпляр вашего класса, а не весь домен приложения. Пул соединений SqlClient находится на AppDomain, поэтому вы получить бесплатный обед.

person Remus Rusanu    schedule 30.04.2010

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

Пул соединений с базой данных ADO.NET НЕ работает в службах WCF для каждого вызова, если вы следуете типичному сценарию (создание экземпляров объектов ADO.NET в объекте службы).

Хотя я понимаю приведенную выше теорию и аргументы, это всего лишь теория.

Простое приложение формы Windows, которое несколько раз проходит этап открытия, запроса, закрытия, покажет вам, что первый вызов Open() занимает довольно много времени, например 2 или 3 секунды, а последующие вызовы и запросы выполняются быстро — эффект соединения объединение.

Если вы поместите идентичный код в службу WCF для каждого вызова, вы получите задержку в 2-3 секунды для КАЖДОГО ВЫЗОВА, первого вызова и всех последующих вызовов. Заключение. Пул соединений с базой данных ADO.NET НЕ работает в службах WCF для каждого вызова, если вы выполняете типичное создание экземпляра ADO в службе.

Вам придется создавать экземпляры объектов ADO на пользовательском узле службы и добавлять соответствующий код синхронизации, если вам нужно, или жить без пула соединений с базой данных.

person PCS    schedule 02.07.2012