Правильное место для подключения БД в веб-сервисе SOAP (.net) - PullRequest
1 голос
/ 11 августа 2009

У меня есть сайт asp.net и база данных.

На веб-сайте есть веб-сервис для хранения отзывов о моем программном обеспечении.

Насколько я знаю, IIS будет повторно использовать созданный объект для последовательных запросов. Это дает основание подключаться к БД в конструкторе веб-службы, правильно реализовывать метод Dispose() и использовать соединение для обслуживания каждого [WebMethod] Request(). Текущее издание следует за этой скороговоркой.

С другой стороны, я боюсь, что промежуток времени между последовательными запросами к веб-сервису будет больше, чем время ожидания соединения с БД. Поэтому мне нужно будет перехватить какое-то исключение и воссоздать соединение (верно?)

Альтернативный подход - соединяться и закрываться в каждом [WebMethod] Foo(). Но я боюсь, что это может повредить производительность.

Подводя итог, я должен соединиться с БД в конструкторе и закрыть соединение в Dispose() или соединиться и закрыть БД для каждого запроса?

Ответы [ 3 ]

5 голосов
/ 11 августа 2009

Вы должны подключиться для каждого запроса.

Экземпляр страницы используется только для одного запроса, поэтому вы не можете сохранить в нем соединение для повторного использования. Вам придется хранить его где-то еще, и это настолько сложно (с учетом безопасности потоков и т. Д.), Что оно определенно не стоит.

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

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

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

1 голос
/ 11 августа 2009

ADO.NET 2.0 и более поздних версий, соединения с БД объединяются, поэтому фактическим открытием и закрытием соединений управляет пул соединений с БД, вы можете свободно открывать и закрывать их в ваших индивидуальных методах, поскольку пул будет держать их открытыми до истечения времени ожидания. Вы также можете настроить параметры пула.

0 голосов
/ 11 августа 2009

Есть ли у вас в распоряжении пул соединений? Ваши объекты WS будут получать соединение из пула и возвращать их после завершения. Пул имеет дело с таймаутами и реальными открытиями и закрытиями.

Мой порядок захода на посадку будет:

1). если у вас есть пул подключений, используйте его.

2). В противном случае будьте проще, открывайте и закрывайте каждый запрос. Запись потокового пула соединений не тривиальна.

3). Если производительность оказывается проблемой, то выясните, не является ли причиной этого каждый раз издержки на подключение. Если это так, найдите пул implmentaiotn или (в крайнем случае) код, объединяющий вас.

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