对于DBD::Informix,我遇到了一些奇怪的问题。如果我运行这样一个简单的脚本:
use DBI;
my $dbh = DBI->connect_cached('dbi:Informix:database', '', '');
my $sth = $dbh->prepare('select foo from bar');
...一切都很顺利。但是,如果我试图从测试脚本中执行完全相同的操作,它就会失败,并收到以下消息:
SQL: -25588: The appl process cannot connect to the database server cms_ol.
ISAM: 22: Invalid argument我看到的唯一不同是,测试脚本在模块使用上相当繁重;它基于Test::More,并加载了许多要测试的子模块。
打开DBI跟踪没有提供任何有用的东西(至少对我来说是这样)。简单的脚本运行得很好:
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()..。我看到的问题脚本跟踪的唯一不同之处在于它只是失败了:
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构建。
更新:如果我试图成为一个聪明的人,并在繁重的测试脚本的顶部放置一个这样的块:
use DBI;
BEGIN { my $dbh = DBI->connect_cached( ... ); print "Connected!\n" if $dbh; }..。印成这样:
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的连接方法,尽管目前还不知道原因。
发布于 2011-09-14 14:51:02
进一步讨论
在我的经验中,自定义Perl比系统Perl更容易。我从不修改系统的Perl安装(我不想破坏它),所以我总是自己构建。
你似乎有:
1.616
我们没有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
CONNECT TO 'cms' - no user info:
要解释的一个棘手部分是为什么第二个失败,特别是当错误继续提到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上工作。
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级别发生的事情更有可能发生。
https://stackoverflow.com/questions/7417409
复制相似问题