OCISessionBegin зависает в многопоточных приложениях COM+ [Delphi + ODAC + Oracle]

Здесь у нас есть приложение, которое использует компоненты ODAC внутри DLL-библиотек COM+ для подключения к Oracle Server 11g.

В последнее время мы столкнулись с проблемой, которую не можем найти решения.

По какой-то причине, когда параллелизм сервера приложений у некоторых наших клиентов слишком высок, некоторые dll начинают зависать и им приходится убивать процесс, чтобы восстановить юзабилити нашего продукта. Пытаясь воспроизвести ошибку здесь, в нашем офисе, мы создали тестовую среду, чтобы нагрузить сервер приложений. Запускаем 30-50 программ, которые звонят в приложение и через какое-то время появляется проблема.

Отладка нашей DLL после зависания сервера показывает, что любой последующий вызов OCISessionBegin не может завершиться. Ошибка не генерируется. Других симптомов не видно.

Последняя строка, которую мы пытаемся выполнить: Check(OCISessionBegin(...)); на OraClasses.pas

Мы проверили базу данных, нет конфликтов, нет блокировок.

Мы используем ODAC 6 на наших клиентах, но мы обновили его до последней версии, и проблема не устранена. Мы должны использовать Oracle Client 10 для подключения к базе данных 11g, потому что используется версия 6 ODAC.

Большое спасибо


person zedmartins    schedule 24.09.2013    source источник


Ответы (1)


Насколько я знаю, вам нужно создать свою среду с обоими наборами атрибутов OCI_EVENTS + OCI_THREADED в такой конфигурации.

Например, вот как он инициализируется в нашем Единица прямого доступа к Oracle с открытым исходным кодом:

  fEnvironmentInitializationMode := OCI_EVENTS or OCI_THREADED;
  ...
  with OCI do
  try
    if fEnv=nil then
      // will use UTF-8 encoding by default, in a multi-threaded context
      // OCI_EVENTS is needed to support Oracle RAC Connection Load Balancing
      EnvNlsCreate(fEnv,Props.EnvironmentInitializationMode,
        nil,nil,nil,nil,0,nil,OCI_UTF8,OCI_UTF8);

Я подозреваю, что вам нужно проверить, как ваша среда OCI создается в ODAC.

person Arnaud Bouchez    schedule 25.09.2013
comment
Большое спасибо, Арно, но я только что проверил источник ODAC, и среда уже создается с помощью OCI_EVENTS + OCI_THREADED, как вы сказали. - person zedmartins; 25.09.2013
comment
@zedmartins Слишком плохо! :( В вашем коде есть одно соединение на поток? - person Arnaud Bouchez; 27.09.2013
comment
каждый поток открывает новое соединение с базой данных в событии активации модуля данных. - person zedmartins; 02.10.2013