Может ли служба WCF без сохранения состояния извлечь выгоду из встроенного пула соединений с базой данных? - PullRequest
1 голос
/ 30 апреля 2010

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

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

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

1 голос
/ 02 июля 2012

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

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

В то время как я понимаю вышеупомянутую теорию и аргументы, они являются только теорией.

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

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

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

...