ADO.net Соединение пулов - PullRequest
       23

ADO.net Соединение пулов

1 голос
/ 27 июля 2010

В приведенном ниже коде объект Provider имеет только один экземпляр DbConnection. Каждый читатель будет ссылаться на один и тот же экземпляр соединения. Согласно документации Microsoft, второй читатель получит второе соединение из пула соединений. Это работает правильно.

using (var reader1 as IDataReader = Provider.GetReader(sqlStatement1))
{
    while(reader1.Read())
    {
        using (var reader2 as IDataReader = Provider.GetReader(sqlStatement2))
        {
            while(reader2.Read())
            {
            //Do stuff with both statements
            }
        }
    }
}

Я бы хотел оставить соединение открытым, пока я использую объект Provider. Однако я не хочу тратить соединения в пуле соединений. Будет ли вызов Provider.DbConnection.Close () попытаться вернуть оба соединения в пул? Если да, как я могу вернуть второе соединение в пул соединений?

Ответы [ 2 ]

0 голосов
/ 28 июля 2010

После тестирования разных провайдеров соединений я нашел свой ответ.

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

Однако поставщик OleDb обрабатывается по-другому.Вместо того, чтобы каждый раз создавать новое соединение, один и тот же объект соединения должен использоваться и располагаться в конце приложения.Если используется так же, как и соединение SqlClient, выдается ошибка «Unspecified error».Каждой OleDbCommand может быть назначен один и тот же экземпляр OleDbConnection.Если он уже используется, основной поставщик назначит ему новое соединение.Делая это с поставщиком SqlClient, он сгенерирует исключение.

Моя исходная строка подключения была такой: Data Source = .... mdb; Provider = Microsoft.Jet.OLEDB.4.0;Это оказалось неудачным после 128 соединений ... С очень дружественной "Неуказанной ошибкой".После исследования пула соединений (не ошибки) этот параметр необходимо было добавить для включения пула соединений. Службы OLE DB = -1;

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

0 голосов
/ 27 июля 2010

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

Эта проблема иногда называется SELECT 1 + N: для каждогострока, возвращенная при первом выборе, вы выполняете дополнительный выбор.Чтобы это исправить, вам потребуется рефакторинг, но все зависит от того, какие данные вы пытаетесь прочитать.

...