【问题标题】:How do I use connect to DB2 with DBI and mod_perl?如何通过 DBI 和 mod_perl 使用连接到 DB2?
【发布时间】:2011-02-11 08:04:28
【问题描述】:

我在让 DBI 的 IBM DB2 驱动程序与 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;
}

此脚本作为 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 工作)。

在 RHEL5 下运行 Apache 2.2.3、mod_perl 2.0.4。

这家伙和我有同样的问题: http://www.mail-archive.com/dbi-users@perl.org/msg22909.html 但我不知道他是如何解决的。 mod_php4和mod_perl有什么关系?

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

更新

正如 james2vegas 所指出的,问题与 PHP 有关:我一起禁用 PHP 我得到了一个不同的错误:

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

我相信这个错误与没有正确设置环境变量有关,即DB2INSTANCE。但是,我无法关闭 PHP 来解决这个问题(一些遗留应用程序需要它)。所以我现在有两个问题:

  1. 如何在不完全禁用 PHP 的情况下解决原始问题?
  2. 如何解决环境问题?

我已经在httpd.conf 中使用SetEnvPerlSetEnv 正确设置了DB2INSTANCE、DB2_PATH 和SQLLIB 变量,但没有成功。

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

【问题讨论】:

  • 这指的是错误的库被 php 加载到 apache 的进程中,并且当它在 mod_perl(也在同一个 apache 进程中)而不是 CGI(这是它自己的独立进程),可能值得在没有 PHP 的情况下进行测试。
  • 你可以尝试获取 DBD::DB2::dr::data_sources();它应该返回一个数据源数组,确保它包含 SAMPLE。
  • 你是对的,如果我禁用 PHP,我会得到一个不同的错误:总环境分配失败!您是否设置了 DB2 客户端环境?这本身就是一个问题,但我以前见过。在过去,这意味着未设置环境变量 DB2INSTANCE。现在我确实使用'SetEnv'和'PerlSetEnv'设置它,但它们似乎没有效果。但另外,服务器运行 PHP 和 perl,所以我不能只关闭 PHP 来解决问题。如何在不一起禁用 PHP 的情况下解决初始问题?
  • 知道了!问题出在 pdo_odbc 上,因此通过在 /etc/php.d/pdo_odbc.ini 中禁用它来解决问题。此外,您在启动脚本中设置环境变量是正确的。我是堆栈溢出的新手(所以我不熟悉这些做法),但是您想发布答案以便我给您加分吗?
  • 根据coding.derkeiler.com/Archive/Perl/perl.dbi.users/2010-01/…,您可以尝试将环境变量 PERL_DL_NONLAZY 设置为 1(您可以在启动脚本中预加载 DBD::DB2 之前尝试这样做。(忽略这个,因为你得到了它)

标签: perl db2 dbi mod-perl


【解决方案1】:

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

【讨论】:

  • 啊,所以加载 DBD 很有趣?我希望这些东西能得到更多的记录……似乎很容易陷入困境。 :(
  • 问题在于 DB2 和 ODBC 的共享库都导出了同名的 SQL_XXXX 函数,而后者覆盖了前者。
【解决方案2】:

普通的旧 DBI 无法在 mod_perl 中工作;当您的进程分叉并且您尝试再次使用您的数据库句柄时,它会变得很糟糕。您需要使用 Apache::DBI(它是 DBI 的替代品),或者更好的是,使用像 DBIx::Connector 这样的后现代 DBI 包装器。

您可以在此处阅读更多详细信息,地址为Apache's guide to using mod_perl with relational databases

【讨论】:

  • 实际上在第二次查看时,您似乎已经安装了 Apache::DBI...我正要上火车,但是当我回到一个终端。
  • 谢谢伙计,是的,我确实在 httpd.conf 中安装并加载了 Apache::DBI。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2018-08-03
  • 2022-01-23
  • 2010-09-21
相关资源
最近更新 更多