Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 dbh и fork()   Yuri A. Wolf   23 Jan 2002 09:54:22 
 Re: dbh и fork()   Artem Chuprina   23 Jan 2002 12:48:50 
 Re: dbh и fork()   Yuri A. Wolf   23 Jan 2002 15:12:44 
 Re: dbh и fork()   Andrey Sapozhnikov   23 Jan 2002 18:49:15 
 Re: dbh и fork()   Artem Chuprina   24 Jan 2002 13:36:32 
 Re: dbh и fork()   Sergey V. Leschenko   25 Jan 2002 00:27:45 
 Re: dbh и fork()   Artem Chuprina   25 Jan 2002 11:18:30 
 Re: dbh и fork()   Sergey V. Leschenko   27 Jan 2002 20:16:24 
Архивное /ru.perl/6359ac5af25a.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional