|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6577dcef0490.html, оценка из 5, голосов 10
|