如何使用DBI和mod_perl连接到DB2?
我在让DBI的IBMDB2驱动程序与mod_perl一起工作时遇到了问题。我的测试脚本是:如何使用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-&
#!/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来解决这个问题(我需要它来解决一些遗留应用程序)。现在我有两个问题:
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?