成功连接4次后数据库连接脚本崩溃

时间:2020-03-06 09:29:43

标签: database perl dbi

我需要查询一组SAP sybase数据库以获取一些信息,并将其打印为逗号分隔列表。因此,我认为我编写了一个Perl脚本,该脚本通过DBI模块连接到这些数据库中的任何一个。这是我想出的。

my $user = "someuser";
my $passwd = "somepassword";
my @sids=(filled with DB identifiers);
my $output="";
my $size;
my $version;
my $id;
my $dsn;
my $dbh;
my $sid;
my @row;
my $sth1;
my $sth2;
foreach $sid (@sids) {
        print $sid."\n";
        $dsn = "dbi:Sybase:server=$sid;charset=iso_1;tdsLevel=CS_TDS_50";
        print $dsn."\n";
        $dbh = DBI->connect($dsn, $user, $passwd,{ PrintError => 0,RaiseError => 0, AutoCommit => 1, syb_enable_utf8 => 1});
        print "DBI OK\n" if defined ($dbh);
        $sth1 = $dbh->prepare('select SUM(size) from master..sysusages WHERE dbid = 4 AND segmap = 3');
        $sth2 = $dbh->prepare('select @@version');
        $sth1->execute;
        while (@row = $sth1->fetchrow) {
                $size = $row[0];
        }
        $size = $size * 16 / 1024;
        $sth1->finish;
        $sth2->execute;
        while (@row = $sth2->fetchrow) {
                $version = $row[0];
        }
        $sth2->finish;
        $output = $sid.",".$size.",".$version;
        $dbh->disconnect;
        print $output."\n";
}

执行此操作时,由于未设置连接句柄,因此它在第4次迭代后崩溃。因此,第五个数据库的连接不再起作用。

Can't call method "prepare" on an undefined value at ./check_sybasedbs.pl line 36.

第36行是语句1的准备。

我尝试将睡眠命令放在各个位置。我还尝试显式清理通过undef重用的变量。现在我没主意了,非常感谢您的投入。

2 个答案:

答案 0 :(得分:1)

您的代码可以作为下面的示例编写(请参见if ... else ...的{​​{1}}块)

$dbh

注意:use strict; use warnings; use feature 'say'; use DBI; my($user, $passwd) = qw/someuser somepassword/; my @sids = qw/server1 server2 ... server#/; foreach my $sid (@sids) { my $dsn = "dbi:Sybase:server=$sid;charset=iso_1;tdsLevel=CS_TDS_50"; say "DSN: $dsn"; my $dbh = DBI->connect($dsn, $user, $passwd, { PrintError => 1, RaiseError => 1, AutoCommit => 1, syb_enable_utf8 => 1 } ); if( not defined ($dbh) ) { say "WARNING: Could not connect to $dsn"; } else { say "INFO: DB connection established"; my($size,$version); my $query = 'SELECT SUM(size) FROM master..sysusages WHERE dbid = 4 AND segmap = 3 '; my $sth = $dbh->prepare($query); $sth->execute; while (@row = $sth->fetchrow) { $size = $row[0]; } $sth->finish; $query = 'select @@version'; $sth = $dbh->prepare($query); $sth->execute; while (@row = $sth->fetchrow) { $version = $row[0]; } $sth->finish; $dbh->disconnect; $size = $size * 16 / 1024; say "SID: $sid, SIZE: $size, VERSION: $version"; } } 有助于避免许多陷阱,use strict; use warnings;有助于在困难情况下识别问题

注意:use diagnostics;允许按名称显示地址哈希元素,而无需像$sth->fetchrow_hashref那样计算数组的索引

答案 1 :(得分:0)

在天真的想法中,我隐藏了一些代码行,使我确信这不是造成此错误行为的原因。事实证明是这样。因此,导致我出现问题的原因是一个简单的逻辑错误,该错误导致密码,该密码在连接到特定数据库后被使用。

相关问题