Fred Moyer wrote: > On Mon, Jul 20, 2009 at 8:15 AM, Nick Wellnhofer<wellnho...@aevum.de> wrote: >> Currently, Apache::DBI never disconnects from the database. This leads >> to the following warnings in my Postgres logs every time an Apache child >> exits: >> >> LOG: unexpected EOF on client connection >> >> Depending on MaxRequestsPerChild this can really spam your Postgres logs. >> >> Attached is a patch against Apache::DBI that adds a PerlChildExitHandler >> in order to disconnect all existing database connections. >> >> Comments are welcome. > > Added a check for the eval and warn, and patch to Changes. I was > trying to think of a good way to test this, but Apache::DBI isn't > setup with Apache::Test yet. > > +1 here, all current tests passing. >
I tested it using the debug function that everything else uses instead of the warn, but other than that it looks fine. As for testing, getting Apache::Test tests working would obviously take some time. Adam > ph...@pooky ~/dev/svn/modperl/Apache-DBI/trunk $ svn diff > Index: lib/Apache/DBI.pm > =================================================================== > --- lib/Apache/DBI.pm (revision 796606) > +++ lib/Apache/DBI.pm (working copy) > @@ -39,6 +39,8 @@ > # a negative value de-activates ping, > # default = 0 > my %LastPingTime; # keeps track of last ping per data_source > +my $ChildExitHandlerInstalled; # set to true on installation of > + # PerlChildExitHandler > > # Check to see if we need to reset TaintIn and TaintOut > my $TaintInOut = ($DBI::VERSION >= 1.31) ? 1 : 0; > @@ -134,6 +136,24 @@ > } > } > > + # this PerlChildExitHandler is supposed to disconnect all open > + # connections to the database > + if (!$ChildExitHandlerInstalled) { > + $ChildExitHandlerInstalled = 1; > + my $s; > + if (MP2) { > + $s = Apache2::ServerUtil->server; > + } > + elsif (Apache->can('push_handlers')) { > + $s = 'Apache'; > + } > + if ($s) { > + debug(2, "$prefix push PerlChildExitHandler"); > + $s->push_handlers(PerlChildExitHandler => \&childexit); > + } > + } > + > + > # this PerlCleanupHandler is supposed to initiate a rollback after the > # script has finished if AutoCommit is off. however, cleanup can only > # be determined at end of handle life as begin_work may have been called > @@ -216,6 +236,24 @@ > 1; > } > > +# The PerlChildExitHandler disconnects all open connections when the > +# httpd child exits > +sub childexit { > + > + my $prefix = "$$ Apache::DBI "; > + debug(2, "$prefix PerlChildExitHandler"); > + > + foreach my $dbh (values(%Connected)) { > + > + eval { DBI::db::disconnect($dbh) }; > + if ($@) { > + warn("error disconnecting db handle: $@"); > + } > + } > + > + 1; > +} > + > # The PerlCleanupHandler is supposed to initiate a rollback after the script > # has finished if AutoCommit is off. > # Note: the PerlCleanupHandler runs after the response has been sent to > Index: Changes > =================================================================== > --- Changes (revision 796606) > +++ Changes (working copy) > @@ -2,6 +2,9 @@ > > 1.08 > > + - Adds PerlChildExitHandler to disconnect existing connections > + Submitted by: Nick Wellnhoffer <wellnho...@aevum.de> > + > 1.07 05/09/2008 > - http://rt.cpan.org/Public/Bug/Display.html?id=31003 > Submitted by: diaf...@gmail.com > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@perl.apache.org > For additional commands, e-mail: dev-h...@perl.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@perl.apache.org For additional commands, e-mail: dev-h...@perl.apache.org