Как очистить пул соединений ODP.NET от ошибок подключения?

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

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

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

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

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

Кроме того, может быть этот пост поможет вам.

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

Ответ 2

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