Как очистить пул соединений ODP.NET от ошибок соединения? - PullRequest
14 голосов
/ 20 апреля 2011

Я использую NHibernate и ODP.NET для подключения к базе данных Oracle 11g. Конечно, могут быть ошибки соединения (сбой сети, сбой БД, ...). Я обрабатываю все эти исключения в своем коде, поэтому никаких проблем нет. Но, конечно, пользователь может повторить свои действия (возможно, это был короткий сбой сети), и возникает моя проблема:

ODP.NET по умолчанию использует пул соединений. Обычно проблем с этим нет, но когда пользователь повторяет действие после ошибки соединения, NHibernate получает недопустимое (объединенное в пул) соединение из ODP.NET. Пользователь должен повторить попытку несколько раз (пока пул не опустеет), чтобы он снова заработал.

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

Есть ли способ настроить ODP.NET для автоматической очистки пула соединений, когда какое-либо соединение вызывает исключение соединения?

Ответы [ 2 ]

3 голосов
/ 26 марта 2013

Если вы можете использовать odac (odp) 11g , у вас есть настройка Validate Connection для вашего пула. Он может проверить соединение, прежде чем использовать его.

Атрибут Validate Connection проверяет соединения, выходящие из пула. Этот атрибут следует использовать только тогда, когда это абсолютно необходимо, поскольку он вызывает обратную передачу в базу данных для проверки каждого соединения непосредственно перед его предоставлением приложению. Если недействительные соединения встречаются редко, разработчики могут создать свой собственный обработчик событий для извлечения и проверки нового соединения, а не использовать атрибут Validate Connection. Как правило, это обеспечивает лучшую производительность.

Если это не будет достаточно хорошо - вы можете попробовать этот документ из оракула. ​​

Управление пулом соединений

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

Используя управление пулом соединений, приложения могут выполнять следующие действия:

Примечание. Эти API не поддерживаются хранимой процедурой .NET. Очистить соединения из пулов соединений с использованием метода ClearPool .

Очистить соединения во всех пулах соединений в приложении домена, используя метод ClearAllPools .

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

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

Также может быть этот пост поможет вам.

Обновление : Как указывает @MPelletier, для oracle 12 ссылка отличается .

0 голосов
/ 21 мая 2011

Вообще говоря, вам следует избегать попыток манипулировать пулом соединений для любого провайдера ADO.NET (а также каналов WCF - в стороне). Если ваше приложение должно быть устойчивым перед лицом основных ошибок данных (например, тайм-ауты, разрывы соединений в пуле и т. Д.), Вам следует реализовать соответствующий уровень транзакций, чтобы обеспечить целостность данных и логику повторных попыток для повторного выполнения неудачной операции.

...