【发布时间】:2020-01-17 07:19:01
【问题描述】:
我想使用第一个请求来解析数据库以检索问题列表,然后检索问题中包含的每个项目的数据库中的所有字段。
CachéDB 是一个专有数据库,我不明白我的公司为什么要使用它。老板说:快,面向对象。我们必须使用它。
#! /usr/bin/perl
use DBI;
# my DB is a cache DBI
(...)
$connStr = sprintf(join(';','DRIVER=libcacheodbc.so;SERVER=%s;PORT=%s'
,'DATABASE=%s;PROTOCOL=TCP;UID=%s;PWD=%s'
,'STATIC CURSORS=0;'
)
,'127.0.0.1', ... , $usr, $pass
);
my $dbh = DBI->connect( $connStr , $user , $pass) or die $! ;
my $req1 = $dbh->prepare("Select ip, max(date) as maxdate
from dbtable
group by ip having count(*) > 1");
# TODO: Purge not requested records from the DB.
my $req2 = $dbh->prepare("select *
from dbtable
where ip = ? and date < ?");
my $ans1 = $req1->execute() or die $! ;
while(defined (my $problem_ip = $ans1->fecthrow_hashref())) {
my $ans2 = $req2->execute( $problem_ip->{'ip'}
, $problem_ip->{'maxdate'}
);
# $ans2 eq '0E0'
# $! eq 'Ressource temporarily unavailable'
use Data::Dumper;
print Dumper $ans2->fetchall_hashref() ;
# will fails : Not a reference.
...
# use stuff
}
请求 ($req1 && $req2) 似乎单独工作(当进程停止时)。
如何处理 cacheDB 以同时从多个请求中检索数据?
【问题讨论】:
-
对每个请求使用单独的连接。
-
使用第二个连接,连接函数调用了两次(相同的用户,相同的一切)似乎无法解决问题。
-
但最让我困惑的是你的
$ans1和$ans2变量。它们都是从调用execute()的返回值创建的。但是execute()返回一个标量值(真/假标志或更新的行数)。它从不返回一个对象,但你试图调用这些变量的方法,就好像它们是语句句柄一样。我不知道$ans1->fecthrow_hashref()是如何工作的(但是方法名称中的拼写错误让我怀疑你的所有代码!) -
1.609 版于十年前发布。你为什么用这么老的软件?
-
请注意 $!不包含 DBI 错误,因此您可能会看到虚假的错误消息。您需要改用 $DBI::errstr。