Perl / MySQL "Query was empty" ошибка, вероятно, связанная с многопоточностью - PullRequest
1 голос
/ 10 июля 2010

Я пишу программу для извлечения данных из набора текстовых файлов и помещения их в БД.Все мои команды в настоящее время имеют форму, похожую на эту (с разными запросами):

$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?Как мне поймать баггера?О чем это сообщение об ошибке?

ОБНОВЛЕНИЕ: Проблема заключалась в комбинации буферизации стандартного вывода, вводящего в заблуждение попадания в Google, имени каталога perl и основного случая пердения мозга.

1 Ответ

1 голос
/ 10 июля 2010

Пожалуйста, опубликуйте всю программу Perl.

Ничто из того, что я вижу здесь, не заставляет меня думать, что это проблема многопоточности.Если вы не запрашиваете где-то потоки, вы не получаете несколько потоков в Perl5.

Как дикое предположение, из-за дополнительных операторов печати, изменяющих результаты, это похоже на проблему буферизации.Попробуйте нагреть свой STDOUT с помощью $|=1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...