如何使用DBI和mod_perl连接到DB2?

如何使用DBI和mod_perl连接到DB2?,perl,db2,dbi,mod-perl,Perl,Db2,Dbi,Mod Perl,我在让DBI的IBMDB2驱动程序与mod_perl一起工作时遇到了问题。我的测试脚本是: #!/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-&

我在让DBI的IBMDB2驱动程序与mod_perl一起工作时遇到了问题。我的测试脚本是:

#!/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))."</pre>";

    $dbc = DBI->connect($dsn, $username, $password);

    $sth = $dbc->prepare("SELECT * FROM SOME_TABLE WHERE FIELD='SOMETHING'");
    $sth->execute();
    $row = $sth->fetchrow_hashref();
    print "<pre>".$q->escapeHTML(Dumper($row))."</pre>";

    print $q->end_html;
}
首先,为什么要使用ODBC?安装了本机DB2驱动程序(因此它作为CGI工作)

在RHEL5下运行Apache 2.2.3、mod_perl 2.0.4

这家伙和我有同样的问题: 但我不知道他是怎么修好的。mod_php4与mod_perl有什么关系

任何帮助都将不胜感激,我在谷歌没有运气

更新

正如james2vegas所指出的,问题与PHP有关:我禁用了PHP,所有这些都会导致不同的错误:

我认为这个错误与环境变量设置不正确有关,即
DB2INSTANCE
。然而,我无法关闭PHP来解决这个问题(我需要它来解决一些遗留应用程序)。现在我有两个问题:

  • 如何在不同时禁用PHP的情况下修复原始问题
  • 如何解决环境问题
  • 我已经使用
    httpd.conf
    中的
    SetEnv
    PerlSetEnv
    正确地设置了DB2INSTANCE、DB2_PATH和SQLLIB变量,但运气不好


    注意:我编辑了代码以确定问题是否与全局变量持久性有关。

    普通的旧DBI在mod_perl中不起作用;当您的进程分叉,并且您尝试再次使用db句柄时,它会变得非常困难。您需要使用(它是DBI的替代品),或者更好的是,使用类似的后现代DBI包装器


    您可以在此处阅读更多详细信息。

    这似乎已解决,仅供参考:在/etc/PHP.d/pdo_ODBC.ini中禁用PHP的ODBC支持,设置环境变量并在mod_perl的启动脚本中预加载,尽管可以使用set-to-1强制加载正确的库。

    实际上,再看一眼,您似乎已经安装了Apache::DBI。。。我马上就要上火车了,但是当我回到终端时,我会更深入地挖掘。谢谢,伙计,是的,我确实在httpd.conf中安装并加载了Apache::DBI。这指的是php将错误的库加载到Apache的进程中,这影响了脚本在mod_perl下运行(也在同一个Apache进程中)与CGI(它自己独立的进程)相反,在没有PHP的情况下,可能值得对此进行测试;它应该返回一个数据源数组,确保它包含示例。您是正确的,如果我禁用PHP,我会得到另一个错误:Total Environment allocation failure!您是否设置了DB2客户机环境?这本身就是个问题,但我以前见过。在过去,这意味着没有设置环境变量DB2INSTANCE。现在我确实用“SetEnv”和“perlstenv”设置了它,但它们似乎没有效果。但是另外,服务器运行PHP和perl,所以我不能仅仅关闭PHP来解决这个问题。如何在不同时禁用PHP al的情况下修复初始问题?明白了!问题在于pdo_odbc,因此通过在/etc/php.d/pdo_odbc.ini中禁用它,解决了这个问题。此外,您在启动脚本中设置环境变量的想法是正确的。我不熟悉堆栈溢出(因此我不熟悉这些实践),但是您是否想发布答案以便我能给您打分?根据本文,您可以尝试将环境变量PERL_DL_NONLAZY设置为1(您可以在启动脚本中预加载DBD::DB2之前尝试这样做。(忽略此项,因为您已经获得了它)啊,那么DBD的加载很有趣吗?我希望这些东西能被更多地记录下来……看起来很容易陷入困境。:(问题是DB2和ODBC的共享库都导出同名的SQL_XXXX函数,后者覆盖了前者。
    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
    
     Total Environment allocation failure! Did you set up your DB2 client environment?