lergot has asked for the wisdom of the Perl Monks concerning the following question:
I face quite a big problem at the time that would force me to rewrite loads of code if i can't find an answer :-(
I'm working on Apache 1.3 with mod_perl and Postgres 7.2.
before using ApacheDBI, I was caching my $dbh with an home made singleton object.I used to open connections with AutoCommit On, change AutoCommit on the fly this way :
This was working fine, each of those (this->EmitSignal and $thread->Update) was retrieving the same $dbh from the singleton, autocommit was off and $dbh->commit was commiting all.my $dbh = DBI->connect( ... {AutoCommit => 1, ..} ) ... >> perform some method call here < < local $dbh->{AutoCommit} = 0; eval { # call to EmitSignal on the parent object $this->EmitSignal( $event_id, @extra_args ); # call to Update on another object call "Thread" $thread->Update(); #Serialize thread. $dbh->commit(); }; if ($@) { $dbh->rollback(); die $@; } local $dbh->{AutoCommit} = 1; ...
When i was logging $dbh->{AutoCommit}, there was no value (==0)
Since i installed ApacheDBI, this doesn't work anymore. When i log the $dbh retrieved from the different objects (Thread and the parent object), i've got the same reference, something like Apache::DBI::db=HASH(0x8f1b840) for all of them.
but my error_log gives me Warning in Perl code: commit ineffective with AutoCommit enabled at /home/httpd_akio/pgakio/lib/perl/Akio/ThreadManager.pm line 170
when i log $dbh->{AutoCommit} from Thread object for example, it's 1 and not 0!!
It seems that the $dbh->{AutoCommit} = 0; only affects the $dbh used in the block, and not the one used in the subroutines, something like if the Apache::DBI retrieve from the subroutines was the one created by the connect_on_init from the startup.pl.
The doc says : However, when the $dbh attribute is altered after connect() it affects all other handlers retrieving this database handle. Therefore it's best to restore the modified attributes to their original value at the end of database handle usage.
With further investigation in ApacheDBI, it seems that all the handlers are cached in global %Apache::DBI::Connected. So you only modify the local copy that is send by Apache::DBI.
Isn't it possible to change parameters of the cached handlers??
Am i missing someting?
Isn't it possible to affect directly the Apache::DBI object ?
Thanks a lot for your help monks.
Christophe
janitored by ybiC: <code> tags, as per Monastery convention
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: mod_perl ApacheDBI
by perrin (Chancellor) on Nov 12, 2003 at 18:51 UTC | |
by lergot (Novice) on Nov 13, 2003 at 07:43 UTC | |
|
Re: mod_perl ApacheDBI
by jmanning2k (Pilgrim) on Nov 12, 2003 at 21:47 UTC | |
by iburrell (Chaplain) on Nov 12, 2003 at 23:50 UTC |