2010-06-08 2 views
4

Мы используем ADO для доступа к Oracle 10g release 2, Oledb для Oracle 10g. Мы сталкиваемся с некоторыми проблемами с пулом соединений. База данных находится на удаленной машине, и объединение пулов происходит так, как должно. Но если удаленная машина по какой-то причине опускается, соединение возвращается из пула, и запрос на это соединение терпит неудачу. Когда это соединение закрыто, оно возвращается обратно в пул вместо того, чтобы быть недействительным. Последующие запросы на открытие соединения являются успешными, но запрос завершается с ошибкой. Это странное поведение, согласно спецификациям OLEDB, поставщик должен поддерживать свойство DBPROP_CONNECTIONSTATUS, поэтому в случае недействительного соединения он не будет возвращен обратно в пул.Пул соединений OLEDB Oracle и недействительные подключения

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

Любые идеи о том, как преодолеть это.

Благодаря Mubashir

+0

Я не думаю, что это проект .NET? Я спрашиваю, потому что у нас не было проблем с драйвером ODP .NET на 10g, отлично работал. –

+0

нет его не .NET. мы используем поставщика OLEDB для Oracle с ADO в проекте VC++. –

+0

Используете ли вы какие-либо статические методы для открытия соединений с базой данных? Это длинный снимок, так как это OLEDB/Oracle/VC++, но в .NET/SQL Server зафиксировано поведение коррупции пула базы данных, когда соединение с базой данных открывается статическим методом. –

ответ

0

Соединения восстанавливаются по истечении 10 минут. Время может быть установлено ключом SPTimeout реестра под корневым ключом провайдера oledb.

1

Если вы делаете это программно, использовать TRY блок, так что если что-то случится, он не подведет. С помощью блока try вы можете поймать исключение и проигнорировать его, чтобы ошибки были удалены.

Вы можете указать пулу не принимать недопустимые соединения, отметив недопустимое соединение до его возврата в пул.

+0

как эта функция «пометить недействительную связь» доступна с классической адо. все это должно быть сделано самим водителем. SQL-провайдер работает нормально, но провайдер oracle этого не делает. –

+0

OP сказал, что «он возвращается обратно в пул вместо того, чтобы быть недействительным». и мой ответ был, вероятно, слишком упрощенным. – alexy13

-1

В большинстве случаев реализации пула соединений можно проверить соединение перед его использованием. Например: вы определяете запрос проверки, например select * from dual, и если вы получите соединение из пула, этот запрос будет выполнен. Если это не удастся, соединение будет исключено из пула, и новый будет открыт.

+1

DBPROP_CONNECTIONSTATUS должен делать это на уровне драйвера, но поставщик oracle не поддерживает его должным образом. –

+0

Можете ли вы подумать об ухудшении производительности этого подхода? Разве соединение не связано с «повышением производительности системы»? – Jaywalker

+0

Это зависит от случая. В большинстве случаев это имеет лишь слегка отрицательный эффект. Что делать, если вы не можете позволить себе иметь недопустимые подключения в вашем пуле? В большинстве производственных систем это не вариант. Давайте представим, что существует короткая проблема с сетевым сервером, и вы теряете свой db. Тогда все соединения будут недействительными ... – HamoriZ