2014-12-01 4 views
1

Нужна помощь, потому что я не могу найти решение для своих проблем с DBD :: Oracle.DBD :: Oracle, курсоры и среда в mod_perl

Таким образом, в первом, это текущая ситуация:

  • Мы бежим Apache2 с mod_perl 2.0.4 в нашей компании
    • веб-сервер Apache был создан с запуском скриптом, который заходящий некоторыми переменные среды (LD_LIBRARY_PATH, ORACLE_HOME, NLS_LANG)
    • в httpd.conf есть также переменные среды для LD_LIBRARY_PATH и ORACLE_HOME (через SetEnv)
  • Мы обычно используем модуль DBI perl с драйвером DBD :: Oracle для подключения к нашей основной базе данных
    • Прежде чем мы создадим новый экземпляр DBI, мы также устанавливаем некоторые переменные enl env (% ENV). Мы устанавливаем ORACLE_HOME и NLS_LANG.

До сих пор, это работает отлично. Но теперь мы расширяем нашу систему и должны подключаться к удаленной базе данных. Опять же, мы используем DBI и DBD :: Oracle. Но сейчас есть какие-то новые условия:

  • Новое соединение должно выполняться параллельно с существующим
  • TNSNAMES.ORA для нового соединения находится в другом месте (не в $ ORACLE_HOME '/ сеть./администратора)
  • Новые содержимое базы данных предоставляются хранимые процедуры, которые мы Fetching с DBD :: Oracle и курсоров (как описано здесь: https://metacpan.org/pod/DBD::Oracle#Binding-Cursors)
  • хранимые процедуры возвращения типов объектов и коллекций, содержащих атрибуты оракула DATE
    • Чтобы получить эти даты в читаемом формате, мы устанавливаем новую переменную $ ENV ENV {nls_date_format}
    • Для обеспечения формата даты мы дополнительно изменить сессию alter session set nls_date_format ...

Хорошо, это работает тоже хорошо. Но только если мы создадим новое соединение на консоли. Новое местоположение TNS находится по сценарию, соединение может быть установлено, а также получение данных из процедур курсором также работает. Все типы DATE отформатированы, как указано.

Теперь, если мы попытаемся установить это соединение в среде apache, это не сработает. Сначала имя источника данных не удалось разрешить DBI/DBD :: Oracle. Я думаю, что это из-за нашего нового файла TNSNAMES.ORA или, скорее, местоположение не найдено DBI/DBD :: Oracle в контексте Apache (опубликовано $ ENV {TNS_ADMIN}). Но я не знаю, почему ???

Вторая проблема (если я создаю грязный обходной путь для нашего первого), что формат даты, опубликованный в $ ENV {NLS_DATE_FORMAT}, работает только на первом уровне выбора курсора.

BEGIN OPEN :cursor FOR SELECT * FROM TABLE(stored_procedure) END; 

В приведенном выше примере возвращаются типы коллекций объектов, которые содержат атрибуты даты. В контексте Apache формат, опубликованный NLS_DATE_FORMAT, не распознается.Если я использую простую форму примера

BEGIN OPEN :cursor FOR SELECT SYSDATE FROM TABLE(stored_procedure) END; 

результат (одно поле даты) отформатирован хорошо. Поэтому я думаю, что подчиненные структуры не форматировались, потому что $ ENV {NLS_DATE_FORMAT} работает только в контексте консоли, а не в контексте Apache.

Таким образом, должна быть проблема с переменными среды perl (% ENV), работающими под Apache и mod_perl. Может быть, проблема mod_perl?

Я нахожусь на своем остроумие. Может быть, у кого-нибудь во всем мире есть решение ... и извините мой английский :-) Если вам понадобятся дополнительные объяснения, я постараюсь определить его более точно.

ответ

0

Если ваша проблема заключается в том, что изменения в% ENV, сделанные при обработке запроса, по-видимому, не соблюдаются, это связано с тем, что mod_perl предполагает, что вы можете запускать несколько потоков и фактически не изменять среду процесса при изменении% ENV, поэтому внешние библиотеки (например, клиент oracle) или дочерние процессы не видят изменений.

Вы можете обойти это, предварительно используя prefork MPM, чтобы не возникало проблем с потоками, а затем вносили изменения в среду, используя Env::C вместо хэша% ENV.

+1

это помогло? – ysth

Смежные вопросы