LINUX.ORG.RU

perl DBI и MySQL


0

0

И так, есть perl скрипт который при запуске форкается и подключается к mysql через perl DBI, потом в вечном цикле пишет данные в базу.
Выглядит это примерно так:
---
#!/usr/bin/perl

fork && exit;

$dbh=DBI->connect("DBI:mysql:database=$mysqldbas;host=$mysqlserv;port=$m ysqlport",$mysqluser,$mysqlpass,{AutoCommit=>1,RaiseError=>0,PrintErr or=>1})||&errorcon;

while (<STDIN>)
{
$sth=$dbh->prepare("...");
$sth->execute();
$sth->finish();
}
---
Так вот, после обновления MySQL до 4.1.9, perl до 5.8.5, perl-DBI до 1.40 и perl-DBD-MySQL до 2.9004 скрипт перестал делать риконнект при таймаутах и обрывах, т.е. если на выходных никто не работает, и скрипт ничего не пишет в сокет то mysql убивает соединение и скрипт отваливается, раньше при тех-же условиях perl просто переподключался к мускулу:( Причем это происходит и при подключении через Unix Socket и через TCP Socket (правда в 2 раза чаще).
Есть какие нибудь идеии? А то kill -9 script_pid && /usr/local/bin/script в crontab'е совсем не модно:(

★★

1. Можешь попробовать изменить переменную wait_timeout в MySQL
2. На практике $dbh->{Active} не пробовал, но в качестве теории:

$dbh=DBI->connect("DBI:mysql:database=$mysqldbas;host=$mysqlserv;port=$m
 ysqlport",$mysqluser,$mysqlpass,{AutoCommit=>1,RaiseError=>0,PrintErr
 or=>1})||&errorcon; 

while (<STDIN>) 
{ 

if (!$dbh->{Active}){
$dbh=DBI->connect("DBI:mysql:database=$mysqldbas;host=$mysqlserv;port=$m
 ysqlport",$mysqluser,$mysqlpass,{AutoCommit=>1,RaiseError=>0,PrintErr
 or=>1})||&errorcon; 
}

$sth=$dbh->prepare("..."); 
$sth->execute(); 
$sth->finish(); 
}

вместо $dbh->{Active} можешь попробовать $dbh->ping, но не в курсе поддерживает ли эту функцию драйвер MySQL.

3.Отлавливать ошибку соединения в $sth->errstr или $sth->err после $sth->execute() и делать реконнект.

Ну и т.д.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, наверное второй вариант будет оптимальным.

Но все таки хочется узнать что случилось с DBI:(

Delay ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.