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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Nick Kostirya                        2:5020/400     26 May 2004  17:09:35
 To : Nick Kostirya
 Subject : Re: DBI & during global destruction & ...
 -------------------------------------------------------------------------------- 
 
 
 "Nick Kostirya" <nick@han.kherson.ua> сообщил/сообщила в новостях следующее:
 news:c922n6$so3$1@ddt.demos.su...
 
 >
 > "Andrew Alakozow" <Andrew.Alakozow@f6.n5061.z2.fidonet.org>
 
 сообщил/сообщила
 
 > в новостях следующее: news:3867777853%c91n32$16j4$1@samael.donpac.ru...
 > > NK> Возникала странная ситуация с примитивным классом,
 > > NK> В конструкторе создает соединение к базе, в DESTROY происходит
 > > NK> отсоединение И этот модуль заюзали таким образом, что при глобальной
 > > NK> сборке мусора, вызывается деструктор в тот момент, когда ссылка на
 > > NK> дескриптор базы существует, а метод уже disconnect уже нет!
 > >
 > > Сообщение об ошибке какое? DBI->trace(2) пробовали?
 
 Удалось свести к такому
 ===============
 package Foo;
 use strict;
 use warnings;
 use DBI;
 
 sub new {
  my $class = shift;
  my ($database, $host, $username, $password)=@_;
 
  my $data_sourse_user = "DBI:mysql:$database;$host";
  my $dbh = DBI->connect($data_sourse_user, $username, $password);
  unless ($dbh) {
   warn $DBI::errstr;
   return;
  }
 
  my $self = {};
  $self->{dbh} = $dbh;
 
  bless($self);
 }
 
 DESTROY {
  my $self = shift;
  warn "Foo
 DESTROY --------------------------------------------------------------------
 ";
  warn "self $self";
  warn "self->{dbh} $self->{dbh}";
  $self->{dbh}->disconnect() or warn "Error of disconnection: $DBI::errstr";
 }
 package main;
 no strict;
 
 DBI->trace(2);
 
 my $foo = Foo->new('mysql', 'localhost', '', '');
 
 =====================================
 Это код выдает вот это
 
     DBI 1.42-ithread default trace level set to Ox2/0 (in pid 362)
 
     -> DBI->connect(DBI:mysql:mysql;localhost, , ****)
     -> DBI->install_driver(mysql) for MSWin32 perl=5.008 pid=362 ruid=0
 
 euid=0
        install_driver: DBD::mysql version 2.0419 loaded from
 D:/Programs/Perl/site/lib/DBD/mysql.pm
     <- install_driver= DBI::dr=HASH(0x15db348)
 
     -> connect for DBD::mysql::dr (DBI::dr=HASH(0x15db348)~0x1c53b18
 
 'mysql;localhost' '' **** HASH(0x1bde490)) thr#15d6d7c
 imp_dbh->connect: dsn = mysql;localhost, uid = , pwd =
 imp_dbh->MyLogin: dbname = mysql, uid = NULL, pwd = NULL,host = localhost,
 port = NULL
 imp_dbh->MyConnect: host = localhost, port = 0, uid = NULL, pwd = NULL
 imp_dbh->MyConnect: client_flags = 0
     <- connect= DBI::db=HASH(0x1c53af4) at DBI.pm line 587
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bde4f0)~INNER 'PrintError'
 
 1) thr#15d6d7c
     <- STORE= 1 at DBI.pm line 631
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bde4f0)~INNER 'AutoCommit'
 
 1) thr#15d6d7c
     <- STORE= 1 at DBI.pm line 631
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bde4f0)~INNER 'Username'
 
 '') thr#15d6d7c
     <- STORE= 1 at DBI.pm line 634
     <> FETCH= '' ('Username' from cache) at DBI.pm line 634
     <- connect= DBI::db=HASH(0x1c53af4)
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bde4f0)~INNER
 
 'dbi_connect_closure' CODE(0x1c53a4c)) thr#15d6d7c
     <- STORE= 1 at DBI.pm line 648
 Foo
 DESTROY --------------------------------------------------------------------
 at 1.pl line 26.
 self Foo=HASH(0x1bde4a8) at 1.pl line 27.
 
 self->{dbh} DBI::db=HASH(0x1c53af4) at 1.pl line 29.
     -> disconnect for DBD::mysql::db (DBI::db=HASH(0x1c53af4)~0x1bde4f0)
 
 thr#15d6d7c
 imp_dbh->svsock: 16908c4
     <- disconnect= 1 at 1.pl line 30
 
     -> DESTROY for DBD::mysql::db (DBI::db=HASH(0x1bde4f0)~INNER)
 
 thr#15d6d7c
     <- DESTROY= undef
     -- DBI::END
 
     -> disconnect_all for DBD::mysql::dr (DBI::dr=HASH(0x15db348)~0x1c53b18)
 
 thr#15d6d7c
     <- disconnect_all= '' at DBI.pm line 657
 
 !   -> DESTROY for DBD::mysql::dr (DBI::dr=HASH(0x1c53b18)~INNER)
 
 thr#15d6d7c
 !   <- DESTROY= (not implemented) during global destruction
 =====================================
 
 но если убрать my, заменив
 my $foo = Foo->new('mysql', 'localhost', '', '');
 на
 $foo = Foo->new('mysql', 'localhost', '', '');
 то вывод вот такой
 Name "main::foo" used only once: possible typo at 1.pl line 39.
     DBI 1.42-ithread default trace level set to Ox2/0 (in pid 430)
 
     -> DBI->connect(DBI:mysql:mysql;localhost, , ****)
     -> DBI->install_driver(mysql) for MSWin32 perl=5.008 pid=430 ruid=0
 
 euid=0
        install_driver: DBD::mysql version 2.0419 loaded from
 D:/Programs/Perl/site/lib/DBD/mysql.pm
     <- install_driver= DBI::dr=HASH(0x15db348)
 
     -> connect for DBD::mysql::dr (DBI::dr=HASH(0x15db348)~0x1bda920
 
 'mysql;localhost' '' **** HASH(0x1bd9440)) thr#15d6d7c
 imp_dbh->connect: dsn = mysql;localhost, uid = , pwd =
 imp_dbh->MyLogin: dbname = mysql, uid = NULL, pwd = NULL,host = localhost,
 port = NULL
 imp_dbh->MyConnect: host = localhost, port = 0, uid = NULL, pwd = NULL
 imp_dbh->MyConnect: client_flags = 0
     <- connect= DBI::db=HASH(0x1bda8fc) at DBI.pm line 587
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bd94a0)~INNER 'PrintError'
 
 1) thr#15d6d7c
     <- STORE= 1 at DBI.pm line 631
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bd94a0)~INNER 'AutoCommit'
 
 1) thr#15d6d7c
     <- STORE= 1 at DBI.pm line 631
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bd94a0)~INNER 'Username'
 
 '') thr#15d6d7c
     <- STORE= 1 at DBI.pm line 634
     <> FETCH= '' ('Username' from cache) at DBI.pm line 634
     <- connect= DBI::db=HASH(0x1bda8fc)
 
     -> STORE for DBD::mysql::db (DBI::db=HASH(0x1bd94a0)~INNER
 
 'dbi_connect_closure' CODE(0x1bda854)) thr#15d6d7c
     <- STORE= 1 at DBI.pm line 648
     -- DBI::END
 
     -> disconnect_all for DBD::mysql::dr (DBI::dr=HASH(0x15db348)~0x1bda920)
 
 thr#15d6d7c
     <- disconnect_all= '' at DBI.pm line 657
 
 !   -> DESTROY for DBD::mysql::db (DBI::db=HASH(0x1bd94a0)~INNER)
 
 thr#15d6d7c
 imp_dbh->svsock: 16908c4
 !   <- DESTROY= undef during global destruction
 
 !   -> DESTROY for DBD::mysql::dr (DBI::dr=HASH(0x1bda920)~INNER)
 
 thr#15d6d7c
 !   <- DESTROY= (not implemented) during global destruction
 Foo
 DESTROY --------------------------------------------------------------------
 at 1.pl line 26 during global destruction.
 self Foo=HASH(0x1bd9458) at 1.pl line 27 during global destruction.
 
 self->{dbh} DBI::db=HASH(0x1bda8fc) at 1.pl line 29 during global
 
 destruction.
 
     -> $DBI::errstr (&) FETCH from lasth=none
 
 Can't read $DBI::errstr, last handle unknown or destroyed at 1.pl line 30
 during global destruction.
     <- $DBI::errstr= undef
 Use of uninitialized value in concatenation (.) or string at 1.pl line 30
 during global destruction.
 Error of disconnection:  at 1.pl line 30 during global destruction.
 
 ==============================
 Мой деструктор выполняется после разрушения DBD::mysql::db.
 Hо, самое главное, что self->{dbh} в моем деструкторе все еще существует:
 DBI::db=HASH(0x1bda8fc).
 
 Как разрулить эту ситуацию, когда класс используют без my?
 
 Спасибо, что дочитали до конца такое длинное письмо.
 
 Nick.
 --- ifmail v.2.15dev5.3
  * Origin: Demos online service (2:5020/400)
 
 

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

 Тема:    Автор:    Дата:  
 Re: DBI & during global destruction & ...   Nick Kostirya   26 May 2004 16:31:49 
 Re[2]: DBI & during global destruction & ...   Maxim Yemelyanov   26 May 2004 16:59:13 
 Re: DBI & during global destruction & ...   Nick Kostirya   26 May 2004 17:09:35 
Архивное /ru.perl/6577dcef0490.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional