Проблема с подключением к SQL Server - PullRequest
1 голос
/ 12 января 2011

Мы недавно запустили новый веб-сайт ... в часы пик работает примерно ~ 150 пользователей.В часы пик мы сталкиваемся с проблемой каждые несколько минут, текст исключения приведен ниже.

System.Web.HttpUnhandledException: 
Exception of type 'System.Web.HttpUnhandledException' was thrown. 
---> System.Data.SqlClient.SqlException: The client was unable to establish a connection because of an error during connection initialization process before login. 
Possible causes include the following: 
    the client tried to connect to an unsupported version of SQL Server; 
    the server was too busy to accept new connections; 
    or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.) 

Наш уровень доступа к данным вызывает различные DataTableAdapters, используя следующий синтаксис.

РЕДАКТИРОВАТЬ

Да, da - это имя, присвоенное DataTableAdapter.connection.Open() нет, потому что DataTableAdapter позаботится обо всем этом, верно?

using(TheDataLayer.some.strongly.typedNameTableAdapters.suchAndSuchTableAdapter da = new TheDataLayer.some.strongly.typedNameTableAdapters.suchAndSuchTableAdapter())
        {
            StronglyTyped.DataTable dt = new StronglyTyped.DataTable();
            da.FillByVariousArguments(dt, ..., ...);
            //da.Dispose();

            return something;
        }

Строка подключения выглядит примерно так:

<add name="MyConnectionString"
        connectionString="Data Source=myDBServerName;Initial Catalog=MyDB;User ID=MyUserName;Password=MyPassword"
        providerName="System.Data.SqlClient" />

Я пытаюсь решить проблемубыть в кодексе.Есть ли что-нибудь «простое», что можно сделать, чтобы минимизировать эту проблему?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 12 января 2011

Вы пробовали "Пул подключений" непосредственно в настройках строки подключения?

Пример:

connectionString="....;Pooling=true;Min Pool Size=1;Max Pool Size=10;..."

Подробнее читайте здесь: http://msdn.microsoft.com/en-us/library/8xx3tyca%28v=vs.71%29.aspx

1 голос
/ 15 августа 2012

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

Мы провели обширное расследование, касающееся причин возникновения этого исключения, и внесли много изменений, чтобы исправить проблему.Изменением по умолчанию, которое мы сделали, что облегчило проблему, была настройка пула соединений, установив минимальный размер пула в 1 и максимальный размер пула в 10. (Это может варьироваться в зависимости от вашей ситуации)

Эта проблема будет более распространенной, когда выиметь несколько, т. е. 1000 клиентских БД, и использовать строку подключения по умолчанию (т. е. database = DBName; server = ServerName).Мы явно не устанавливали минимальный / максимальный размер пула, поэтому потребовались настройки по умолчанию, которые устанавливают минимальный размер пула на 0 и максимальный размер пула на 100.

Опять же, у меня нет конкретных доказательств, но теория такова, что во время занятостив тот день, в зависимости от нагрузки, было установлено несколько соединений с сервером БД, и сервер БД был засыпан большим количеством запросов на соединение в одной точке к нескольким базам данных.Либо сервер приложений, либо сервер БД имели пропускную способность для обработки такого количества соединений за короткий промежуток времени.Кроме того, это происходило с сервером с большинством баз данных.Хотя мы не видели большого количества соединений одновременно, но сервер приложений не смог установить соединение с базами данных в течение короткого периода времени, когда в него входило множество запросов.

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

1 голос
/ 12 января 2011

Не видя код, который фактически открывает и использует соединение, трудно сказать, в чем проблема.

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

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

0 голосов
/ 06 августа 2012

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

...