|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 23 Jan 2002 12:48:50 To : "Yuri A. Wolf" Subject : Re: dbh и fork() -------------------------------------------------------------------------------- Здравствуй, Yuri A. Wolf. YAW> Hi, All! YAW> Давно заметил проблемму, решаю извращениями всякими, но хочется в корне YAW> исправить: YAW> Вот пример скоипта: YAW> #!/usr/bin/perl -w YAW> use strict; YAW> use DBI; YAW> my $dbname = 'mydbname'; YAW> my $host = '127.0.0.1'; YAW> my $user = 'myuser'; YAW> my $password = 'mypasswd'; YAW> my $sth; YAW> my $dbh = DBI->connect("DBI:mysql:database=$dbname;host=$host", YAW> $user, $password, {'RaiseError' => 1}) YAW> || die "Can't connect: $DBI::errstr\n"; YAW> my $cond = 1; YAW> while ($cond) { YAW> $sth = $dbh->prepare("SELECT * from mytable WHERE SOMECONDITION") || die YAW> "$dbh->errstr\n"; YAW> $sth->execute || die "$dbh->errstr\n"; YAW> while (my $ref = $sth->fetchrow_hashref()) { YAW> if (my $pid = fork) { YAW> $dbh->do("UPDATE users SET current_batch = 0, date_sent = date_sent YAW> WHERE id = $user_id YAW> AND current_batch = 1" YAW> ) || die "$dbh->errstr\n"; YAW> } else { YAW> die "Can't fork: $!" unless defined $pid; YAW> #... здесь может случиться и die, причем не по ошибке, а по моей YAW> просьбе YAW> exit; YAW> } YAW> } YAW> $sth->finish || die "$dbh->errstr\n"; YAW> # здесь где-то $cond может смениться, чтобы вышли из цикла... YAW> } YAW> $dbh->disconnect(); YAW> Скрипт покоцанный, но все важное показано. YAW> 1. А теперь вопросы: по поводу subj'а ничего странного нет - есть ли что-то YAW> не по правилам DBI? YAW> 2. Может "MySQL: connection lost произойти" когда child сделает die? Да, разумеется. По завершении ребенка, неважно, каким способом, происходит смерть $dbh, в связи с чем ему делается неявный disconnect. Сиречь в том числе просьба серверу закрыть соединение. А соединение-то одно и то же. YAW> 3. Как в случае использования fork() с DBI рaботать? Сначала fork, и только потом connect. Есть альтернатива, но чреватая - наследовать DBI::DB и переопределять в нем disconnect, чтобы тот соображал, а стоит ли реально отцепляться от сервера (читай: в ребенке не стоит). Собственно, так делает Apache::DBI. По идее, по завершении всех процессов, которые держат данный сокет, сокет сам должен отстрелиться, а мыскль, соответственно, адекватно на такое отреагировать и закрыть сессию у себя. Hо это не слишком вежливо, а кроме того, если ребенок сказал LOCK и умер, лок тоже не пропадет, пока не помрут все. В "больших" базах данных те же грабли с транзакциями. Hо в "больших" проще - просто переопределяем disconnect() на на do nothing, а на rollback. А тут придется локи ловить (есть у меня подозрение, что DBD::mysql не делает этого в rollback). -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5 * Origin: Talk.Mail.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6359ac5af25a.html, оценка из 5, голосов 10
|