我正在编写一个程序,从一堆文本文件中提取数据,然后将其放入数据库。我的所有命令当前都具有与此类似的表单(使用不同的查询):
$query = "INSERT INTO relations (relation_type_id, confidence) VALUES ($reltypeid, $conf)";
print "$query\n";
$result = $conn->query($query);
$relid = $result->insertid();
...
但是,我注意到在执行过程中会出现随机错误,如下所示:
INSERT INTO relations (relatiDBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
DBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
on_type_id, confidence) VALUES (12, 0.709310711263845)
如果我用
perl -w
我得到这个:
INSERT INTO relations (relatiUse of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/DBD/mysql.pm line 211.
Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
DBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/DBD/mysql.pm line 211.
Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
DBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
on_type_id, confidence) VALUES (12, 0.709310711263845)
现在让我担心的是,很明显,一些多线程的垃圾正在发生——程序不会死,错误会插入到打印的中间——我不知道如何调试它。据记录,我自己除了倒勾之外,没有在任何地方分叉或穿线。
zcat
,这些是包含的所有包:
use Switch;
use File::Basename;
包括在
pm
:
use Mysql;
use Exporter qw(import);
此外,我在谷歌上搜索了错误消息,但无法获得完整的信息(姓名和位置)。只是错误名称(“查询为空”)击中了一篇文章,其中海报正从随后分叉的两个进程访问连接。
还有一点需要注意:这种现象是确定性的。只要代码是完整的,错误总是出现在同一个地方。如果我更改输出(例如,插入一些标记行,如
print "---";
为了分开我的记录块),错误发生在前面(不能说它是否在输出的相同字节计数上)。
有没有办法禁用
perl
?我怎么抓住那个家伙?那个错误消息是关于什么的?
更新:
问题在于stdout缓冲、误导性的google命中、perl目录名和一个主要的brain-fart案例的结合。