Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Connection leaks в ODP.NET  [new]
Ksninv
Member

Откуда:
Сообщений: 2
Здравствуйте!
Имеется приложение, которое выполняет синхронизацию данных между удалённым WCF-сервисом и базами данных. Некоторые базы данных подключены по VPN-каналу (как правило связь медленная). Итерацию синхронизации необходимо выполнять раз в десять секунд.

Использую в качестве компонента для работы с Oracle:
Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342


Проблема в том, что компонент вызывает следующее исключение:

Oracle.ManagedDataAccess.Client.OracleException (0xFFFFFC18): Connection request timed out
   in OracleInternal.ConnectionPool.PoolManager`3.CreateNewPR(Int32 reqCount, Boolean bForPoolPopulation, ConnectionString csWithDiffOrNewPwd, String instanceName)
   in OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
   in OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
   in OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword)
   in Oracle.ManagedDataAccess.Client.OracleConnection.Open()
   in MySyncApp.DBRepository.GetChangedDataDB(DateTime startPeriod) in D:\MySyncApp\MySyncApp\DB.cs:line 23
   in MySyncApp.Program.<>c__DisplayClass30.<>c__DisplayClass32.<Synchronize>b__2f(ID id) in D:\MySyncApp\MySyncApp\Program.cs:line 441


Трейс, при возникновении этого исключения:
(PUB) (ERR) OracleConnection.Open() (txnid=n/a) Oracle.ManagedDataAccess.Client.OracleException (0xFFFFFC18): Connection request timed out
   in OracleInternal.ConnectionPool.PoolManager`3.CreateNewPR(Int32 reqCount, Boolean bForPoolPopulation, ConnectionString csWithDiffOrNewPwd, String instanceName)
   in OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
   in OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
   in OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword)
   in Oracle.ManagedDataAccess.Client.OracleConnection.Open()


Но вся головная боль состоит в том, что не смотря на то, что выбрасывается исключение "Connection request timed out" соединение устанавливается и будет находится в подвешенном состоянии ("INACTIVE" в сессиях Oracle) до тех пор, пока я не перезагружу приложение (видимо, связанный с программой пул убивается). При "max pool size=5" количество соединений вырастает далеко за эти самые пять соединений. При "Pooling=false" аналогично. Большое количество таких висящих соединений вызывает проблемы на стороне базы данных.

Я пробовал параметры
(TRANSPORT_CONNECT_TIMEOUT=8)
и
(CONNECT_TIMEOUT=8)(RETRY_COUNT=1)
в tnsnames.ora, поведение аналогичное.

Примерная строка соединения (перепробовал кучу разных параметров):
User id=usr;Password=pwd;Data Source=database1;Validate connection=True;Connection timeout=8;Pooling=false

Скорее всего, это вызвано лагающим соединением, при котором запрос на установку соединений уходит, но потом приходит с задержкой явно более 8 секунд назад и каким-то образом поддерживается клиентом.

Настройки компонента в приложении (app.config):

  <configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess" />
  </configSections>
  <oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="TNS_ADMIN" value="D:\MySyncApp\MySyncApp\ADMIN\" />
        <setting name="TCP.CONNECT_TIMEOUT" value="8" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>


Помогите, пожалуйста. Сражаюсь с этой ошибкой уже более недели.

К сообщения прикладываю демку, которая ведёт себя аналогичным образом (по таймеру наращивает количество висящих соединений).

К сообщению приложен файл (DemoPool.zip - 4Kb) cкачать
4 ноя 13, 12:48    [15073973]     Ответить | Цитировать Сообщить модератору
 Re: Connection leaks в ODP.NET  [new]
Ksninv
Member

Откуда:
Сообщений: 2
Ссылка на компонент: [url=]https://www.dropbox.com/s/r8ynyvp1tgu6d31/Oracle.ManagedDataAccess.dll[/url] (не подходит по размеру для прикрепления в тему)
4 ноя 13, 12:50    [15073980]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Connection leaks в ODP.NET  [new]
mciv.ru
Member

Откуда: Москва
Сообщений: 1
получилось с этим что-нибудь сделать? у меня то же самое. подозреваю, что из-за сбойного винчестера
19 ноя 15, 11:28    [18439757]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить