Как использовать соединение с DB2 с DBI и mod_perl? - PullRequest
2 голосов
/ 23 апреля 2010

У меня проблемы с получением драйвера IBM DB2 IBM DB для работы с mod_perl. Мой тестовый скрипт:

<code>#!/usr/bin/perl

use strict;
use CGI;
use Data::Dumper;
use DBI;

{
    my $q;
    my $dsn;
    my $username;
    my $password;
    my $sth;
    my $dbc;
    my $row;

    $q = CGI->new;
    print $q->header;
    print $q->start_html();

    $dsn = "DBI:DB2:SAMPLE";
    $username = "username";
    $password = "password";

    print "<pre>".$q->escapeHTML(Dumper(\%ENV))."
"; $ dbc = DBI-> connect ($ dsn, $ username, $ password); $ sth = $ dbc-> prepare ("SELECT * FROM SOME_TABLE WHERE FIELD = 'SOMETHING'"); $ Sth-> Execute (); $ row = $ sth-> fetchrow_hashref (); печать "
".$q->escapeHTML(Dumper($row))."
"; print $ q-> end_html; }

Этот скрипт работает как CGI, но не под mod_perl. Я получаю эту ошибку в журнале ошибок Apache:

DBD::DB2::dr connect warning: [unixODBC][Driver Manager]Data source name not found, and no default driver specified at /usr/lib/perl5/site_perl/5.8.8/Apache/DBI.pm line 190.
DBI connect('SAMPLE','username',...) failed: [unixODBC][Driver Manager]Data source name not found, and no default driver specified at /data/www/perl/test.pl line 15

Прежде всего, почему он использует ODBC? Установлен собственный драйвер DB2 (следовательно, он работает как CGI).

Запуск Apache 2.2.3, mod_perl 2.0.4 под RHEL5.

У этого парня была та же проблема, что и у меня: http://www.mail-archive.com/dbi-users@perl.org/msg22909.html Но я понятия не имею, как он это исправил. Какое отношение mod_php4 имеет к mod_perl?

Любая помощь будет принята с благодарностью, мне не повезло с Google.

Обновление

Как указал james2vegas, проблема связана с PHP: я отключаю PHP все вместе и получаю другую ошибку:

 Total Environment allocation failure! Did you set up your DB2 client environment?

Я считаю, что эта ошибка связана с неправильной настройкой переменных среды, а именно DB2INSTANCE. Однако я не могу отключить PHP для решения этой проблемы (он мне нужен для некоторых устаревших приложений). Итак, теперь у меня есть 2 вопроса:

  1. Как я могу исправить исходную проблему, не отключая PHP все вместе?
  2. Как я могу исправить проблему с окружающей средой?

Я правильно установил переменные DB2INSTANCE, DB2_PATH и SQLLIB, используя SetEnv и PerlSetEnv в httpd.conf, но безуспешно.

Примечание. Я отредактировал код, чтобы определить, связана ли проблема с сохранением глобальной переменной.

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Это выглядит решенным, для справки: отключите поддержку PHP ODBC в /etc/php.d/pdo_odbc.ini, установите переменные среды и предварительно загрузите DBD :: DB2 в сценарии запуска mod_perl, хотя это может можно использовать PERL_DL_NONLAZY , установленный в 1, для принудительной загрузки правильной библиотеки.

1 голос
/ 23 апреля 2010

Обычный старый DBI не будет работать в mod_perl;все шатается, когда ваш процесс разветвляется, и вы пытаетесь снова использовать свой дескриптор базы данных.Вам необходимо использовать Apache :: DBI (это замена для DBI) или, что еще лучше, использовать постмодернистскую оболочку DBI, такую ​​как DBIx :: Connector .

Подробнее вы можете прочитать здесь, на Руководство Apache по использованию mod_perl с реляционными базами данных .

...