Сеансы С# WinForm Oracle зависают после закрытия соединения

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

using(OracleConnection con = new OracleConnection(constring))
{
con.Open();
}

И я также пытался закрыть и удалить соединение вручную и использовать OracleConnection.ClearPool(con) и OracleConnection.ClearAllPools(), но ни один из них не работает.

ссылка, которую я использую: System.Data.OracleClient версии 2.0.0.0

строка подключения Data Source = ip/db; Идентификатор пользователя = пользователь; Пароль=pw;


person trksyln    schedule 06.01.2017    source источник
comment
На самом деле это не ответ, но у нас была очень похожая проблема, где я недавно работал. Один из других разработчиков добавил это в нашу строку подключения, и, похоже, все стало лучше. Я конечно не спец в этом, но может и вам поможет. Минимальный размер пула = 0; Максимальный размер пула = 16; Увеличение размера пула = 2; Размер пула Decr = 1; Подтвердить соединение = Ложь; Время жизни соединения = 0; Просто добавьте это в строку подключения и посмотрите, как все пойдет.   -  person BigTallJosh    schedule 06.01.2017
comment
Incr Pool Size, Decr Pool Size и Validate Connection unsupported ключевое слово :(   -  person trksyln    schedule 06.01.2017
comment
Моя ошибка, я пропустил, что вы все еще используете System.Data.OracleClient. В настоящее время это устарело. Вы пробовали использовать более новый адаптер ODAC? oracle.com/technetwork/topics/dotnet/downloads/   -  person BigTallJosh    schedule 06.01.2017
comment
Я бы с удовольствием, но я должен использовать net 2.0 framework, и я думаю, что 2.0.0.0 — новейший адаптер для него. по крайней мере от майкрософта. извините, я забыл упомянуть, что я использую сеть 2.0 и спасибо за вашу помощь.   -  person trksyln    schedule 08.01.2017


Ответы (1)


Такое поведение является нормальным, потому что если вы Dispose(); соединение, ConnectionPool от Oracle на самом деле не уничтожает соединение, а устанавливает статус «свободно». Поэтому в следующий раз, когда вы открываете соединение, вы на самом деле не открываете новое соединение, вы просто ищете «свободное» соединение в своем пуле соединений и используете его. Если свободного подключения не существует, будет создано новое.

Такое поведение гарантирует лучшую производительность, потому что Open/Close Connections стоит очень дорого.

Если вы используете:

using(OracleConnection con = new OracleConnection(constring)) 
{
}

or

con.Close();

Это то же самое, что вы используете Dispose();. Используя, просто убедитесь, что Dispose вызывается в конце вашего блока использования. Вот почему использование работает только с объектами, которые реализуют IDisposable.

Пока все в порядке... Но почему OracleConnection.ClearAllPools()не закрывает соединения? Это действительно так, но Oracle напрямую создает новое соединение, так что ваш ConnectionPool заполняется до вашего MinPool-Size. Вот почему код BigTallJosh:

«Минимальный размер пула = 0; Максимальный размер пула = 16; Размер пула увеличения = 2; Размер пула уменьшения = 1; Проверить соединение = Ложь; Время жизни соединения = 0;

остановить это поведение. Минимальный размер пула, равный 0, остановит автоматическое создание новых соединений.

Здесь вы можете найти хороший объяснение о методе ClearAllPools();.

Итак, наконец, ответ на ваш вопрос. Установите MinPoolSize=0 и после этого вызовите connection.ClearAllPools();. Это должно работать.

person Sebi    schedule 06.01.2017
comment
Clearpool() и Clearpools() работали после изменения текущей ссылки с помощью Oracle.DataAccess 2.102.2.20, но теперь у меня будут некоторые проблемы с клиентом oracle на некоторые компьютеры :( спасибо за ваши усилия - person trksyln; 06.01.2017
comment
@trksyln Добро пожаловать. Интересно, что в этой версии есть проблема. - person Sebi; 06.01.2017
comment
Спасибо за объяснение, я не совсем понял, что наш другой разработчик сделал, чтобы сделать нашу лучше, но это ясно объясняет! +1 - person BigTallJosh; 06.01.2017