|
Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема
|
DESTROY i DBI.pm
|
|
Автор |
Bruta () |
Публикувано | 15.09.02 22:00 |
|
Znachi plojenieto e slednoto. Pisha obekt za rabota s bazi danni koito izpolzva DBI.pm. kogato se syzdade pyrvi obekt, pravq konekciq s bazata danni. Ako sled tova se syzdade oshte edin obekt, ne pravq otdelna konekciq i za nego, ami izpolzvam syshtata koqto veche imam. vyv funkciqta DESTROY za moite obekti gledam dali obekta koito se unishtojava e posledniq. Ako e posledniq definiran obekt t.e. broqcha na broq na obektite mi e 0, izpylnqvam $dbh->disconnect(), ako ne e - dekrementiram broqcha na broq na obektite si i ne pravq nishto s $dbh. Problemyt e che kogato DBI useti che se namira v DESTROY sam se disconnectva, bez znachenie dali go iskam. Mislih si dali da ne si syzdam otdelna funkciq-destruktor za moite obekti, no ne iskam da pravq taka a da si izpolzvam DESTROY. Kak moga da izbegna tova koeto pravi DBI.pm. 10x
| |
Тема
|
Re: DESTROY i DBI.pm
[re: Bruta]
|
|
Автор | edno momiche (Нерегистриран) |
Публикувано | 16.09.02 03:17 |
|
"Note that Perl will automatically destroy database and statement handle objects if all references to them are deleted"
destroy iztriva connection reference handle-a ti($dbh). prestrukturirai si programata i obektite
| |
|
Da, tova mi e qsno, chel sym dokumentaciqta. Vseki obekt si dyrji referenciq kym tozi dbh. Taka che dokato ne se unishtoji i posledniq moi obekt, vinagi imam pone edna referenciq kym $dbh.
| |
|
edno momiche, izvinqvai:-)
beshe prava, greshkata si e moq. Sled pyrviq obekt drugite prisvoqvaha greshna referenciq i po tozi nachin kym $dbh imashe samo edna nezavisimo ot broq na obektite.
| |
|
hm, pak stana interesno... Znachi napravil sym si da mi izpisva tochno koga se izpylnqva $dbh->disconnect(). Na pryv pogled izglejda dobre, izvyrsshva go tochno kogato trqbva. Obache kato trace-vam, DBI->trace(5), mnogo qsno se vijda che $dbh se disconnectva prinuditelno, izpisvaiki mi " Issuing rollback() fot database handle being DESTROY'd without explicit disconnect() during global destruction ", i to pri unishtojavaneto na pyrviq vlqzyl v DESTROY obekt, a moqt disconnect izobshto ne se izpylnqva.
E, na koe da vqrvam sega? na trace() ili na $dbh->disconnect() and print "Disconnected";
| |
Тема
|
Re: DESTROY i DBI.pm
[re: Bruta]
|
|
Автор | edno momiche (Нерегистриран) |
Публикувано | 17.09.02 06:36 |
|
bazata danni supportva li transactions? - ako da, setnat li e autocommit? kakvo praviat obektite ti s $dbh? ako praviat transakcii (da priemem che db-to gi supportva) - commitvash li gi?
mislia che neshto si omazal iako po koda, i ne razbiram kakvo tolkova pravish s destroy. ako pastenesh malko kod moje bi niakoi shte uspee da nameri greshkata
btw, error message-a ti idva ot:
"The database is automatically disconnected by the DESTROY method if still connected when there are no longer any references to the handle. The DESTROY method for each driver should implicitly call rollback to undo any uncommitted changes. This is vital behavior to ensure that incomplete transactions don't get committed simply because Perl calls DESTROY on every object before exiting. Also, do not rely on the order of object destruction during "global destruction", as it is undefined."
| |
Тема
|
Re: DESTROY i DBI.pm
[re: Bruta]
|
|
Автор | edno momiche (Нерегистриран) |
Публикувано | 17.09.02 06:49 |
|
prochetoh otnovo posta ti (iavno ne sum mu oburnala mnogo vnimania parvia put)
mislia che neshto ne ti e mnogo iasno/ili na men ne mi e iasno kakvo se opitvash da pravish/ : ne mojesh da slojesh counter i da go decrementvash podred vav destroy metod, i da ochakvash da raboti pravilno i podred. koga tochno destroy na daden obekt se izvikva ne e definirano - i ti prosto ne mojesh da znaesh - poradi koeto tvoite destruktori ne triabva da izvurshvat operacii koito razchitat na niakakav red na izvikvane, ili vreme na izvikvane, ili neshto podobno.
napravi si pool obekt koito da 'durji' state-a na tvoiata konekcia i izpolzvai nego vmesto global counter decrementvan ot destruktorite na obektitet ti. i ne zabraviai za commit-a
.edno momiche
| |
|
Taka...
znachi v paketa imam nqkolko globalni za nego promenlivi. $population - tq broi kolko obekta imam syzdadeni. @objects - vseki element na masiva e referenciq kym nqkoi moi obekt po reda na syzdavaneto im.
Opciite s koito se svyrzvam kym bazara danni (MySQL) sa:
my $opt = { 'AutoCommit' => 1,
'PrintError' => 1,
'RaiseError' => 0 };
Ne izpolzvam tranzakcii.
Eto go i konstruktora:
sub new
{
my($pkg, $db, $user, $pass) = @_;
my($object);
if(!@objects) #ako nqma definirani drugi obekti
{
@_ == 4 or die 'Usage: db->new(database, user, password);';
my $dsn = 'dbi:mysql:'.$db.';mysql_socket=/tmp/mysql/mysql.sock';
($dbh = DBI->connect($dsn, $user, $pass, $opt)) or die $DBI::errstr;
$object->{dbh} = $dbh;
$object->{user} = $user;
$object->{pass} = $pass;
$object->{db} = $db;
$object->{id} = 0;
$population = 1; #inicializirame broqcha na obektite
push @objects, $object; #pyrviqt element na masiva sochi kym pyrviq obekt
}
else
{
$object->{dbh} = $dbh; #vzema syshtata referenciq kato pyrviq obekt
$object->{user} = $objects[0]->{user}; #i usera e syshtiq
$object->{pass} = $objects[0]->{pass};
$object->{db} = ($db or $objects[0]->{db}); #ako e podadena baza danni
push @objects, $object; #vzemame referenciqta kym obekta, i pri drugite
$object->{id} = $#objects; #id-to na tozi obekt e posledniq element na masiva
$population++; #incrementirame broq na obektite
}
return bless $object, $pkg;
}
nadqvam se che koda se razbira. shte dam malko dopylnitelni svedeniq za atributite.
$object{dbh} - stoinosta na tova e ravna na tazi na $dbh. crez nego izpylnqvam do(), fetch(), ...
{user} - usera s koito sym se svyrzal s bazata
{pass} - parolata
{db} - bazata danni v koqto shte raboti obekta
{id} - s tova znam tozi obekt koi pored mi e, i taka znam kyde v @objects se namira toi
samo pri syzdavaneto na pyrviq obekt iziskvam user i pass. Pri sledvashtite ne sa mi nujni tyi kato izpolzvam syshtata konekciq. Za vseki obekt moje da se zadade v koq baza danni da operira, predpolagam che usera ima prava za tova. Ako ne e zadadena, izpolzvam tazi na pyrviq obekt.
sega eto q i DESTROY:
sub DESTROY
{
# print "\nDESTROY\n";
my($self) = $_[0];
$population--; #dekrementiram broq na obektite
$objects[$self->{id}] = undef; #referenciq kym tozi obekt ne mi e nujna veche
# print "POPULATION: $population\n";
$dbh->disconnect() and print "\n\nDISCONNECT\n\n" if $population == 0; #i ako tova e posledniq mi obekt, disconnect
}
reshih da izpolzvam metoda s broene na obektite, poneje go vidqh v edna kniga...:-)
Tova koeto iskam e da znam che vryzkata mi s bazata danni shte se prekysne kogato veche nqmam aktivni moi obekti, a po kakyv nachin tochno shte e...
10x.
P.S. izvinqvam se za podredbata na koda, obache se premahvat intervalite...
| |
Тема
|
Re: DESTROY i DBI.pm
[re: Bruta]
|
|
Автор | edno momiche (Нерегистриран) |
Публикувано | 17.09.02 15:24 |
|
vzemi sloji skobi okolo
$dbh->disconnect() and print "\n\nDISCONNECT\n\n" if $population == 0
po princip kakto e napisano s 'and' bi triabvalo da se eval-va otliavo nadiasno no znae li chovek..
az lichno podobni izrazi gi pisha taka
($population == 0) && ($dbh->disconnect(), print "\n\nDISCONNECT\n\n" );
(niamat znachenie intervalite, no ako te drazni polzvai pre tagove - klubovete gi podurjat \[pre\] \[/pre\])
shte go probvam kato mi ostane malko vreme
sorry che ne pomognah mnogo
.edno momiche
| |
|
Blagodarq.
($population == 0) && ($dbh->disconnect(), print "\n\nDISCONNECT\n\n" ); - neobichaen i interesen stil na pisane, ne sym sresthal takyv dosega
| |
|
Страници по тази тема: 1 | 2 | >> (покажи всички)
|
|
|