代码之家  ›  专栏  ›  技术社区  ›  Amadan

perl/mysql“query was empty”错误,可能与多线程相关

  •  1
  • Amadan  · 技术社区  · 15 年前

    我正在编写一个程序,从一堆文本文件中提取数据,然后将其放入数据库。我的所有命令当前都具有与此类似的表单(使用不同的查询):

    $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案例的结合。

    1 回复  |  直到 15 年前
        1
  •  1
  •   masonk    15 年前

    请发布整个Perl程序。

    我在这里看到的任何东西都不能让我认为这是一个多线程的问题。除非您在某个地方请求线程,否则Perl5中不会有多个线程。

    作为一个疯狂的猜测,由于额外的打印语句改变了结果,这感觉像是一个缓冲问题。尝试用热的你的性传播疾病 $|=1;