[mysql + perl] поймать момент отваливания соед. с бд

Alena_08_11

в общем в двух словах, скрипт в начале работы инициализует соединение с БД, затем в цикле читает построчно pipe, и пишет чё то в бд. То есть примерно так :

....
while
{
$dbh = DBI->connect("DBI:mysql:database=".$dbname.";host=".$dbhost,$dbuser,$dbpw) or die "Ne mogu connect to mysql".$DBI::errstr;
open(MYPIPE, "<$logpipe") || die "OMG, Ne mogu otkrit' $logpipe";
while(<MYPIPE>)
{

($p1,$p2 ... ) = split;
$query = "insert into mylog values('".$p1."','".$p2."', ...... )";
$result = $dbh->prepare($query) or die "Kakaya to huynya".$DBI::errstr;
$result->execute or die "Omg Wtf ppc".$DBI::errstr;
....
}
close(MYPIPE);
$dbh->disconnect;
sleep 10;
}
....

Я конечно понимаю, что скрипт - полная фигня, некошерен и т.д. Но главное, он хоть как то работает. НО, иногда, как я понимаю, в цикле while(<MYPIPE>){ ....} отваливается соединение с бд, и данные в бд не попадают ( я ещё паралельно в лог файл пишу - в нём всё это есть). Внешний цикл я добавил, когда обнаружил что иногда скрипт думает что pipe прочтён до конца и выходит из цикла while(<MYPIPE>){ ... }. На всякий случай в этот же цикл добавил дисконнект бд и новый коннект.
В общем, как проще всего перед записью в бд, не отвалилось ли соединение, и если отвалилось - то сделать новое ?
ps. Perl я не знаю, особого желания вникать в тонкости - нет (даже скорее времени нет, чем желания). Нужно просто сделать чтобы работало.
ps2. pipe в данном контексте - это то, что я сделал с помощью mkfifo. Туда скидывает свои логи другая прога, подружить которую с mysql - для меня очень проблематично. Os : FreeBSD 6.2, ядро почти generic, mysql Ver 14.14 Distrib 5.1.22-rc, for portbld-freebsd6.2 (i386) using 5.0,perl 5.8.8 (Хотя врятли вся эта инфа нужна в данном контексте :) )

ermsoft

Не могу не процитировать:

ermsoft

По делу:

sub connect {
return DBI->connect("DBI:mysql:database=".$dbname.";host=".$dbhost,$dbuser,$dbpw, {AutoReconnect => 1, RaiseError => 1, PrintError => 0}) or die "Ne mogu connect to mysql".$DBI::errstr;
}

sub insert($) {
$_ = shift;
($p1, $p2, ...) = split;
... // prepare, execute
}

$dbh = connect;
open(MYPIPE, "<$logpipe") || die "OMG, Ne mogu otkrit' $logpipe";
while(<MYPIPE>)
{
eval {
insert($_);
}; if ($@) {
warn $@;
$dbh = connect;
insert($_);
}
}
close(MYPIPE);
$dbh->disconnect;
sleep 10;

Как-то так. Из расчета что если коннект порвался дважды подряд, то пора ломаться.
Во внешний while не верю, хотя кто его знает, не пользовался никогда mkfifo.
Ну и все же прочитай про placeholder'ы, а то стыдно потом будет :)

Alena_08_11

Спасибо
завтра попробую.

Serega009

Ну и с учётом этого:
# prepare, execute
$query = q{
insert into mylog values(?,?, . . . )
};
$result = $dbh->prepare($query) or die "Kakaya to huynya".$DBI::errstr;
$result->execute($p1, $p2, . . .) or die "Omg Wtf ppc".$DBI::errstr;
Оставить комментарий
Имя или ник:
Комментарий: