首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBD::Informix连接问题

DBD::Informix连接问题
EN

Stack Overflow用户
提问于 2011-09-14 13:48:19
回答 1查看 1.2K关注 0票数 2

对于DBD::Informix,我遇到了一些奇怪的问题。如果我运行这样一个简单的脚本:

代码语言:javascript
复制
use DBI;
my $dbh = DBI->connect_cached('dbi:Informix:database', '', '');
my $sth = $dbh->prepare('select foo from bar');
...

一切都很顺利。但是,如果我试图从测试脚本中执行完全相同的操作,它就会失败,并收到以下消息:

代码语言:javascript
复制
SQL: -25588: The appl process cannot connect to the database server cms_ol.
ISAM: 22: Invalid argument

我看到的唯一不同是,测试脚本在模块使用上相当繁重;它基于Test::More,并加载了许多要测试的子模块。

打开DBI跟踪没有提供任何有用的东西(至少对我来说是这样)。简单的脚本运行得很好:

代码语言:javascript
复制
DBI 1.616-nothread default trace level set to 0x0/1 (pid 9685 pi 0) at test_ifx.pl line 6
Note: perl is running without the recommended perl -w option
-> DBI->connect(dbi:Informix:cms@cms_ol, , ****, HASH(0x13fad0))
-> DBI->install_driver(Informix) for solaris perl=5.008009 pid=9685 ruid=106 euid=106
   install_driver: DBD::Informix version 2011.0612 loaded from /cms/webdash/lib/arch/DBD/Informix.pm
<- install_driver= DBI::dr=HASH(0x1c8070)
!! warn: 0 CLEARED by call to connect method
    -->> DBD::Informix::dbd_ix_db_connect()
CONNECT TO 'cms@cms_ol' - no user info
    -->> DBD::Informix::dbd_ix_db_check_for_autocommit()

..。我看到的问题脚本跟踪的唯一不同之处在于它只是失败了:

代码语言:javascript
复制
DBI 1.616-nothread default trace level set to 0x0/1 (pid 9687 pi 0) at 22_report.t line 5 via 22_report.t line 6
Note: perl is running without the recommended perl -w option
-> DBI->connect_cached(dbi:Informix:cms, , ****)
-> DBI->install_driver(Informix) for solaris perl=5.008009 pid=9687 ruid=106 euid=106
   install_driver: DBD::Informix version 2011.0612 loaded from /cms/webdash/lib/arch/DBD/Informix.pm
<- install_driver= DBI::dr=HASH(0xb619bc)
!! warn: 0 CLEARED by call to connect_cached method
    -->> DBD::Informix::dbd_ix_db_connect()
CONNECT TO 'cms' - no user info
***ERROR***
SQL: -25588: The appl process cannot connect to the database server cms_ol.
ISAM: 22: Invalid argument
    <<-- dbd_ix_db_connect (**ERROR-1**)
    <<-- DBD::Informix::dbd_ix_db_connect()

我正在Solaris 9中使用最新的DBI和DBD::Informix版本,针对InformixIDS9.40UC运行自定义Perl 5.8.9构建。

更新:如果我试图成为一个聪明的人,并在繁重的测试脚本的顶部放置一个这样的块:

代码语言:javascript
复制
use DBI;
BEGIN { my $dbh = DBI->connect_cached( ... ); print "Connected!\n" if $dbh; }

..。印成这样:

代码语言:javascript
复制
Connected!
Out of memory!
Callback called exit.
END failed--call queue aborted at t/22_report.t line 20.
Callback called exit at t/22_report.t line 20.
BEGIN failed--compilation aborted at t/22_report.t line 24.

我的猜测是DBD::Informix与连接完成后加载的一些模块发生冲突。但是哪一个呢?这就是问题..。

另一个更新:上面的技巧似乎做了一些笨拙的事情。我试图显式加载所有模块,将“use”替换为“;Module->import”.纯Perl模块是可以的,但是每当使用XSLoader的XS模块出现时,Perl就会出现友好的“内存不足”消息。如果我将Informix连接移到模块初始化下面,它可以正常工作--除了DBD::Informix失败时有相同的-25588错误。布默。我迷路了。:(

另一个更新:我尝试使用Solaris 9附带的标准Perl5.6.1运行相同的脚本,使用DBI 1.601 (最新的版本为Perl5.6编译)和DBD::Informix 2011.0612。同样的事情,所以它不是自定义Perl给我带来麻烦。

我还可以补充说,所讨论的测试模块是使用DBD::SQLite进行原型化的,并且完全可以工作。这是DBD::Informix失败的最后一次测试.像往常一样。:/

解决办法:在与Jonathan进行电子邮件讨论之后,找到了一个解决办法:在Informix服务器上添加基于流的“onipcstr”连接,允许DBD::Informix连接。显然,一些XS模块干扰了默认的基于shmem的连接方法,尽管目前还不知道原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-14 14:51:02

进一步讨论

在我的经验中,自定义Perl比系统Perl更容易。我从不修改系统的Perl安装(我不想破坏它),所以我总是自己构建。

你似乎有:

1.616

  • DBD::Informix 2011.0612

  • ESQL/C (
  • Solaris 9)
  • Perl 5.8.9
  • DBI

我们没有ESQL/C和IDS的详细子版本(2.81.UC2、9.40.UC5或其他任何版本)。有一个提示,您正在使用32位版本的IDS,所以可能所有的东西都是32位的。您可能知道IBM不再支持9.40 (实际上,它的后续版本10.00也不再受支持)。然而,从表面上看,这一切都不太重要。失败的t91lvarchar.t并不是什么大问题。

可以在environment.中设置DBI_TRACE=9的工作模式和非工作模式下运行连接。

如果connect操作的跟踪量太大,无法对问题进行更新,那么我们最好将其脱机到DBD::Informix支持通道(这是我,但通过电子邮件)。

22 (无效参数)的“ISAM”错误令人费解。我很好奇这个服务器的sqlhost文件中有什么内容--特别是用于cms_ol的条目。我不确定它会揭示什么,尤其是因为您说下面的示例ESQL/C (在“第一个假设”部分中)工作正常,有时Perl连接,有时则不连接。

我想知道共享库中的函数之间是否存在名称冲突?这类事情很难追踪。

第一假设

收到的进一步资料表明,这不是关键的区别。

区别似乎是:

CONNECT TO 'cms@cms_ol' - no user info

  • Fails:CONNECT TO 'cms' - no user info

  • Works

要解释的一个棘手部分是为什么第二个失败,特别是当错误继续提到cms_ol时。

解决方法是在连接字符串中指定服务器名称:

  • DBI->connect(dbi:Informix:cms@cms_ol, , ****, HASH(0x13fad0))
  • DBI->connect_cached(dbi:Informix:cms, , ****)

与其他Perl模块相比,ESQL/C级别的底层问题更有可能出现。也就是说,如果您编译并执行这个ESQL/C程序,它将在cms上失败,并在cms@cms_ol上工作。

代码语言:javascript
复制
int main(int argc, char **argv)
{
    $ char *dbs = "cms";
    if (argc > 1)
        dbs = argv[1];
    $ whenever error stop;
    $ connect to :dbs;
    return 0;
}

您可以在没有显式数据库名称的情况下运行它(或者使用显式的“cms”),我希望它会失败。您可以使用'cms@cms_ol‘运行它,我希望它能够通过。如果它通过了,程序什么也不会说;当它失败时,它将是显而易见的(尽管消息不会很漂亮)。

这可能与connect_cached有关;这是由DBI模块提供的服务,而不是由DBD::Informix模块提供的服务。但是,总的来说,在ESQL/C级别发生的事情更有可能发生。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7417409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档