Почему пулы соединений ведут себя по-разному на разных серверах? - PullRequest
2 голосов
/ 19 февраля 2009

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

Эта программа в настоящее время работает параллельно как на сервере разработки, так и на рабочем сервере, с одними и теми же данными, что и ввод, и запись на разные серверы вывода.

На сервере разработки все нормально; около 30 с лишним пулов соединений открыты за один раз, и он работает успешно (это может показаться высоким, но мы выполняем несколько последовательных коротких запросов для каждого входа, и объем данных большой). На рабочем сервере оно всегда максимально на 100 подключений и иногда выдает исключение, указывающее, что исчерпаны доступные подключения в пуле.

Существуют ли какие-либо настройки SQL Server, которые могут вызывать это несоответствие? Единственное другое отличие состоит в том, что рабочий сервер находится под дополнительной нагрузкой из разных источников.

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

Ответы [ 3 ]

2 голосов
/ 04 марта 2009

Ответ оказался таков, что способ, которым я устанавливал CommandBehaviour.CloseConnection на моих SqlDataReaders, был неверным (я не использовал правильную битовую комбинацию). Так что у меня все-таки были утечки соединений.

1 голос
/ 19 февраля 2009

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

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

Вы всегда должны выполнять свою работу с базой данных в режиме Try / Catch, объявляя соединение и команду снаружи и инициализируя внутри. Вы никогда не должны полагаться на закрытие соединения в try / catch, всегда закрывать / удалять в блоке finally:

try
{
    m_Connection = this.getConnection();
    m_Command = this.getCommand();
    m_Command.CommandTimeout = m_ConnectionTimeout;
    m_Command.CommandText = sql;
    m_Command.Connection = m_Connection;
    m_Command.CommandType = CommandType.Text;

    m_Connection.Open();

    return m_Command.ExecuteNonQuery();
}
finally
{
    if (m_Connection != null && m_Connection.State != ConnectionState.Closed)
    {
        m_Connection.Close();
        m_Connection.Dispose();
    }

    if (m_Command != null)
        m_Command.Dispose();
}

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

0 голосов
/ 19 февраля 2009

Пул соединений - проблема ado.net, потому что сервер SQL не выполняет пул соединений. Из памяти максимальный размер ado.net для пула соединений равен 100, поэтому вы находитесь в пределах своего максимума. Несколько вещей, которые вы можете попробовать в своем приложении, - это жестко настроить пул соединений, используя минимальный размер пула и максимальный размер пула в строке соединения.

Больше можно найти здесь и здесь .

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