[mysql + perl] поймать момент отваливания соед. с бд
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'ы, а то стыдно потом будет
завтра попробую.
# 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;
Оставить комментарий
Alena_08_11
в общем в двух словах, скрипт в начале работы инициализует соединение с БД, затем в цикле читает построчно pipe, и пишет чё то в бд. То есть примерно так :Я конечно понимаю, что скрипт - полная фигня, некошерен и т.д. Но главное, он хоть как то работает. НО, иногда, как я понимаю, в цикле 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 (Хотя врятли вся эта инфа нужна в данном контексте )