Тайм-аут подключения С# к базе данных оракула при перезапуске пула приложений

У нас есть веб-страница, которая использует ODP.Net для подключения к базе данных оракула со страницы ASP MVC. Во время большой пользовательской нагрузки, если пул приложений перезапускается по какой-либо причине, мы получаем несколько ошибок тайм-аута соединения от внутреннего класса оракула.

Внутреннее исключение: StackTrace: at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)

Как мы можем справиться с этим сценарием? в чем может быть причина этой ошибки?


person Zeus    schedule 07.10.2017    source источник
comment
Я не думаю, что это связано с перезапуском пула приложений. Проблема в том, что вы достигли максимального размера пула. Вероятно, вы забыли закрыть соединение где-то в своем коде, что приводит к тому, что соединение с пулом не возвращается для обслуживания других запросов, или размер вашего пула настолько мал.   -  person Khanh TO    schedule 07.10.2017
comment
Если вы забыли закрыть соединение, оно в конце концов будет закрыто, но это произойдет только тогда, когда сборщик мусора соберет эти объекты. Таким образом, многие соединения не возвращаются в пул в течение достаточно долгого времени, что может привести к достижению максимального размера пула.   -  person Khanh TO    schedule 07.10.2017
comment
Я делаю соединение внутри блока USING, поэтому соединение закрывается. Эта проблема возникает только иногда, поэтому, если соединение не было закрыто, мы должны видеть это часто, верно?   -  person Zeus    schedule 07.10.2017
comment
даже если соединение не закрывается немедленно, мы не увидим эту ошибку, если сервер не находится под большой нагрузкой, потому что соединение в конечном итоге закрывается сборщиком мусора   -  person Khanh TO    schedule 07.10.2017


Ответы (1)


Если вы используете новую строку подключения, которая отличается для каждого пользователя или с каким-либо другим переменным параметром, вы можете превысить максимальное количество подключений. Объединение работает, только если вы используете точно такую ​​же строку. Под прикрытием ваше «закрытие» игнорируется, и диспетчер соединений сохраняет соединение открытым. В SQL Server вы можете увидеть сброс соединения в консоли трассировки каждый раз, когда существующее соединение используется повторно.

У Oracle, вероятно, есть что-то подобное.

Отслеживание ваших соединений и, возможно, сброс соединений, скорее всего, прольют свет на то, что создает так много соединений.

person No Refunds No Returns    schedule 07.10.2017
comment
Та же строка подключения из web.config - person Zeus; 09.10.2017